C# Process.Start的转义字符串

C# Process.Start的转义字符串,c#,cmd,escaping,C#,Cmd,Escaping,如何转义传递给Process.Start的未知字符串作为参数 我目前不使用基本引号和反斜杠,但最近我的输入开始包含(全宽引号)之类的内容 所以我的问题是,为了安全地传递一个字符串作为Process.Start的参数,我需要做什么才能转义呢 编辑: 所以我需要澄清这一点。我真正想要的是cmd.exe中所有必须在引号字符串(“foo”)中转义的字符的列表。我最初处理的是双引号字符和反斜杠字符,但我最终得到了一些包含全宽引号(如上所述)的输入,这也需要转义。所以问题是,对于通过Process.Star

如何转义传递给Process.Start的未知字符串作为参数

我目前不使用基本引号和反斜杠,但最近我的输入开始包含(全宽引号)之类的内容

所以我的问题是,为了安全地传递一个字符串作为Process.Start的参数,我需要做什么才能转义呢

编辑: 所以我需要澄清这一点。我真正想要的是cmd.exe中所有必须在引号字符串(“foo”)中转义的字符的列表。我最初处理的是双引号字符和反斜杠字符,但我最终得到了一些包含全宽引号(如上所述)的输入,这也需要转义。所以问题是,对于通过Process.Start传递给cmd.exe的带引号的字符串参数,我还需要转义什么呢?

这可能很有用:

  • 首先,多个参数通常通过 空间。在图2.3中,命令 三个参数,c::.bak,e:\backup, 及/s。偶尔,其他角色 用作参数分隔符。对于 例如,“复制”命令可以使用+ 字符来分隔多个字符 文件名

  • 第二,任何包含空格或以空格开头或结尾的参数 必须用双引号括起来。 这在以下情况下尤为重要: 使用长文件名和目录名, 通常包含一个或多个 空间。如果一个双引号参数 它本身包含一个双引号 字符,双引号必须为 加倍。例如,输入“Quoted” 参数为“”引用的“参数”

  • 第三,命令开关总是以斜杠/字符开头。A. switch是一个修改 在某些情况下命令的操作 对。有时,开关从 一个+或-字符。有些开关是 全局,并影响命令 不管他们在社会中的地位如何 参数列表。其他开关为 局部参数,并影响特定参数 (例如紧接前面的那一个 开关)

  • 第四,所有不在双引号中的保留shell字符必须 逃脱。这些角色有 Windows NT的特殊意义 命令shell。保留的外壳 字符包括:

    &|()<>^

将保留的shell字符作为 命令参数的一部分, 要么整个参数必须是 用双引号括起来,或 保留字符必须转义。 在保留字符前面加上前缀 克拉(^)字符来转义它。对于 例如,下面的命令示例 将无法按预期工作,因为< 和>是保留的外壳字符:

  1. C:\>echo <dir>
  2. The syntax of the command is incorrect.

  Instead, escape the two reserved characters, as follows:

  1. C:\>echo ^<dir^>
  2. <dir>
1。C:\>回声
2.该命令的语法不正确。
相反,请按如下方式转义这两个保留字符:
1.C:\>回声^
2.
通常,保留的shell 命令中不使用字符, 所以需要使用 逃跑是很少见的。它们确实发生了, 然而。例如,流行的 PKZIP程序支持-切换到(&W) 启用磁盘扩展。用这个 在Windows NT下正确切换-^& 必须打字

提示:克拉字符本身是一个保留的外壳字符。因此 键入克拉字符作为字符集的一部分 命令参数,键入两克拉 相反逃跑只是必要的 当正常的外壳解释 保留字符的数目必须为 绕过

  • 最后,最大允许长度为 一个shell命令似乎是 没有微软的记录。简单的 测试表明,Windows NT 命令shell允许非常长的时间 命令超过4000个 人物。实际上,, 没有明显的上限 命令的长度

是我见过的最接近于解释Windows命令行参数疯狂的例子。它不像最初看起来那么简单

一般来说,你不需要逃离U+FF02。问题是,如果您最终将该字符传递给不支持Unicode的命令行,它将被压缩到其不兼容的等价项,即ASCII引号,在这一点上它将变得危险。如果您的命令指向不支持Unicode的工具,则应在应用参数转义之前将其向下折叠为ASCII,而不是让另一端的工具执行此操作


(通常,当该工具使用C stdlib读取其参数时会出现问题。这是根据8位
char
定义的;Windows stdlib实现使用默认(“ANSI”)系统代码页将字符串编码为8位,并且该代码页永远不是Unicode转换格式,因此您将始终丢失字符。)我试图逃跑:

    public static string QuoteArgument(string arg)
    {
        // The inverse of http://msdn.microsoft.com/en-us/library/system.environment.getcommandlineargs.aspx

        // Suppose we wish to get after unquoting: \\share\"some folder"\
        // We should provide: "\\share\\\"some folder\"\\"

        // Escape quotes ==> \\share\\\"some folder\"\
        // For quotes with N preceding backslashes, replace with 2k+1 preceding backslashes.
        var res = new StringBuilder();
        // For sequences of backslashes before quotes:
        // odd ==> 2x+1, even => 2x ==> "\\share\\\"some folder"
        var numBackslashes = 0;
        for (var i = 0; i < arg.Length; ++i)
        {
            if(arg[i] == '"')
            {
                res.Append('\\', 2 * numBackslashes + 1);
                res.Append('"');
                numBackslashes = 0;
            }
            else if(arg[i] == '\\')
            {
                numBackslashes++;
            }
            else
            {
                res.Append('\\', numBackslashes);
                res.Append(arg[i]);
                numBackslashes = 0;
            }
        }
        res.Append('\\', numBackslashes);

        // Enquote, doubling last sequence of backslashes ==> "\\share\\\"some folder\"\\"
        var numTrailingBackslashes = 0;
        for (var i = res.Length - 1; i > 0; --i)
        {
            if (res[i] != '\\')
            {
                numTrailingBackslashes = res.Length - 1 - i;
                break;
            }
        }
        res.Append('\\', numTrailingBackslashes);

        return '"' + res.ToString() + '"';
    }
公共静态字符串QuoteArgument(字符串arg)
{
//相反的http://msdn.microsoft.com/en-us/library/system.environment.getcommandlineargs.aspx
//假设我们希望在取消引用后获取:\\share\“some folder”\
//我们应该提供:“\\share\\\”一些文件夹\“\\”
//转义引号==>\\share\\\“一些文件夹”\
//对于前面有N个反斜杠的引号,替换为前面有2k+1个反斜杠。
var res=新的StringBuilder();
//对于引号之前的反斜杠序列:
//奇数==>2x+1,偶数=>2x==>“\\share\\\”某个文件夹
var numBackslashes=0;
对于(变量i=0;istring link = @"https://www.google.com/search?q=\""Hello+World!\""";
Process.Start("CHROME.EXE", link);