如何避免包含空格的路径问题

11

为了将带有空格的路径传递给.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,其中路径省略了转义。

如何使用通用解决方案解决它?(不需要手动搜索需要转义和引用的每个参数的值)

2个回答

6
我认为这是不可能的,因为空格是CLI参数的分隔符,所以它们需要被转义。
你可以将其提取为扩展方法,这样你就可以在上面的代码中直接运行args.Escape()
public static string[] Escape(this string[] args)
{
    return args.Select(s => s.Contains(" ") ? string.Format("\"{0}\"", s) : s).ToArray();
}

太好了!谢谢!顺便说一下,在这里没有必要使用 string[]IEnumerable<string> - abatishchev

6

只需引用每个参数。这样做可以使代码更加清晰易懂。

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

这是一个完全有效的命令行,可以准确地执行您想要的操作。


看起来不错,但我还是更喜欢@amarsuperstar的解决方案 :) 谢谢,Heinzi - abatishchev
不适用于路径末尾带有反斜杠“\”的情况,例如“C:\Program Files\MyApp"。 - EdmundYeung99
1
@EdmundYeung99:是的,那确实是一个棘手的问题。以下问题包含了一些解决该问题的尝试:https://dev59.com/CG035IYBdhLWcg3wSOCr - Heinzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接