2010-09-17 5 views
10

Pour passer un chemin avec des espaces à l'application console .NET, vous devez lui échapper. Probablement pas échapper, mais entourer de guillemets doubles:Comment faire pour échapper chemin d'accès contenant des espaces

myapp.exe --path C:\Program Files\MyApp` 

DEVIENT

new string[] { "--path", "C:\Program", "Files\MyApp" } 

mais

myapp.exe --path "C:\Program Files\MyApp" 

devient

new string[] { "--path", "C:\Program Files\MyApp" } 

et il fonctionne très bien et vous pouvez analyser si facilement .

Je veux étendre l'ensemble des paramètres donnés avec un ajout d'un et de commencer un nouveau processus avec l'ensemble des paramètres résultant:

new ProcessStartInfo(
    Assembly.GetEntryAssembly().Location, 
    String.Join(" ", Enumerable.Concat(args, new[] { "--flag" }))) 

Cela devient myapp.exe --path C:\Program Files\MyApp --flag où chemin descend son Évasion.

Comment contourner le problème avec une solution commune? (sans chercher la valeur de chaque paramètre nécessitant de s'échapper et de l'indiquer manuellement)

Répondre

5

Je ne pense pas que ce soit possible puisque l'espace est le délimiteur pour les arguments CLI, donc ils devraient être échappés.

Vous pouvez très bien extraire ceci dans une méthode d'extension de sorte que vous pouvez simplement exécuter args.Escape() dans votre code ci-dessus.

public static string[] Escape(this string[] args) 
{ 
    return args.Select(s => s.Contains(" ") ? string.Format("\"{0}\"", s) : s).ToArray(); 
} 
+0

Parfait! Merci! btw, je pense qu'il n'y a pas besoin de 'string []' et 'IEnumerable ' suites bien ici – abatishchev

4

Il suffit de citer chaque paramètre. This ...

myapp.exe "--path" "C:\Program Files\MyApp" "--flag" 

... est une ligne de commande parfaitement valide et fait exactement ce que vous voulez.

+0

c'est-à-dire 'Select (s => String.Format (" \ "{0} \" ", s))'. Regarde bien mais la solution de @ amarsuperstar me plaît un peu plus :) Merci, Heinzi – abatishchev

+0

ne fonctionne pas dans un cas où le chemin a un "\" final tel que "C: \ Program Files \ MyApp \" – EdmundYeung99

+1

@ EdmundYeung99: Oui, c'est une question vraiment délicate. La question suivante contient quelques tentatives pour contourner le problème: http://stackoverflow.com/q/5510343/87698 – Heinzi

Questions connexes