Как избежать пути, содержащего пробелы

чтобы передать путь с пробелами в консольное приложение .NET, вы должны избежать его. Вероятно, не избежать, но окружить двойными кавычками:

myapp.exe --path C:Program FilesMyApp`

становится

new string[] { "--path", "C:Program", "FilesMyApp" }

но

myapp.exe --path "C:Program FilesMyApp"

становится

new string[] { "--path", "C:Program FilesMyApp" }

и он отлично работает, и вы можете легко разобрать это.

Я хочу расширить набор параметров, заданных с добавлением одного и начать новый процесс с результирующим набором параметров:

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

этот становится myapp.exe --path C:Program FilesMyApp --flag где путь отбрасывает свой побег.

как обойти это с общим решением? (без поиска значения каждого параметра, требующего экранирования и цитирования вручную)

2 ответов


Я не думаю, что это возможно, так как пространство является разделителем для Аргументов CLI, поэтому их нужно было бы экранировать.

вы можете извлечь это в метод расширения довольно красиво, так что вы можете просто запустить args.Escape() в вашем коде выше.

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

просто укажите каждый параметр. Этот...

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

...вполне допустимо командной строки и делает именно то, что вы хотите.