相关疑难解决方法(0)

在c#中转义命令行参数

精简版:

它是足够用引号括参数和逃生\"

代码版本

我想string[] args使用ProcessInfo.Arguments 将命令行参数传递给另一个进程.

ProcessStartInfo info = new ProcessStartInfo();
info.FileName = Application.ExecutablePath;
info.UseShellExecute = true;
info.Verb = "runas"; // Provides Run as Administrator
info.Arguments = EscapeCommandLineArguments(args);
Process.Start(info);
Run Code Online (Sandbox Code Playgroud)

问题是我将参数作为数组获取,并且必须将它们合并为单个字符串.可以设计一个参数来欺骗我的程序.

my.exe "C:\Documents and Settings\MyPath \" --kill-all-humans \" except fry"
Run Code Online (Sandbox Code Playgroud)

根据这个答案,我创建了以下函数来逃避单个参数,但我可能错过了一些东西.

private static string EscapeCommandLineArguments(string[] args)
{
    string arguments = "";
    foreach (string arg in args)
    {
        arguments += " \"" +
            arg.Replace ("\\", "\\\\").Replace("\"", "\\\"") +
            "\"";
    }
    return arguments;
}
Run Code Online (Sandbox Code Playgroud)

这是否足够好或者是否有任何框架功能?

.net c# command-line-arguments

72
推荐指数
4
解决办法
3万
查看次数

用于转义.NET命令行参数的规范解决方案

问题:给定文件名和任意字符串列表,是否有一种规范的方法来创建单个命令行,以便Environment.GetCommandLineArgs(和C#的void main(String[] args)/ VB Sub Main(args() As String))将返回相同的字符串列表?


背景:.NET将命令行拆分为参数的方式非常复杂,例如:

如果双引号跟随两个或偶数个反斜杠,则每个前进的反斜杠对将替换为一个反斜杠,并删除双引号.如果双引号跟随奇数个反斜杠(包括只有一个),则每个前一对用一个反斜杠替换,剩下的反斜杠被删除; 但是,在这种情况下,双引号不会被删除.

许多人尝试简单的"将每个参数放在双引号中并转义现有的双引号"方法,并且只要其中一个参数包含一个尾部反斜杠就会失败.有关此问题的StackOverflow存在各种问题,例如:

然而,他们的答案要么不够通用,不能为所有案例提供规范解决方案,要么似乎是"迭代地"开发("哦,还有一个我忘了的特殊情况,让我们添加它,现在它应该覆盖大多数情况...... ").由于这是一个非常常见的问题,我希望看到一个解决方案,例如,通过其中任何一个提供信心

  • 来自权威来源(可能来自参与此疯狂命令行约定的开发人员之一的博客条目)或
  • 提供给定算法满足.NET命令行要求的正式证明.

.net c# vb.net command-line-arguments

15
推荐指数
1
解决办法
2833
查看次数

标签 统计

.net ×2

c# ×2

command-line-arguments ×2

vb.net ×1