【问题标题】:How to escape path containing spaces如何转义包含空格的路径
【发布时间】:2011-04-13 15:03:58
【问题描述】:

要将带有空格的路径传递给 .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,路径放弃了它的转义。

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

【问题讨论】:

    标签: c# escaping console-application command-line-arguments


    【解决方案1】:

    我认为这是不可能的,因为空格是 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> 套房
    【解决方案2】:

    只需引用每个参数。这……

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

    ...是一个完全有效的命令行,完全符合您的要求。

    【讨论】:

    • Select(s => String.Format("\"{0}\"", s))。看起来不错,但我更喜欢 @amarsuperstar 的解决方案 :) 谢谢 Heinzi
    • 在路径有尾随“\”例如“C:\Program Files\MyApp\”的情况下不起作用
    • @EdmundYeung99:是的,这是一个非常棘手的问题。以下问题包含解决该问题的一些尝试:stackoverflow.com/q/5510343/87698
    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 2016-12-29
    • 2011-12-22
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多