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

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

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

становится

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

но

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

становится

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

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

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

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

Это становится myapp.exe --path C:\Program Files\MyApp --flag, где путь отключается.

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

Ответ 1

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

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

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

Ответ 2

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

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

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