我试图将多个路径作为参数传递给控制台应用程序,但收到“路径中的非法字符”错误。参数的最后两个字符似乎出现了错误"C:\test\"
对于转义的双引号。
例如,如果我用 C# 创建一个新的空控制台应用程序,如下所示:
static void Main(string[] args)
{
Console.WriteLine(args[0]);
Console.ReadLine();
}
并且,在“项目属性”->“调试”下,我添加了一个命令行参数,如下所示:
![Project properties showing CLI Argument: "C:\test\"](https://i.stack.imgur.com/zFIKT.png)
然后我的输出看起来像这样:
![Command prompt showing output: C:\test"](https://i.stack.imgur.com/Mr1rW.png)
如果该值正在被评估/未转义,为什么\t
不变成标签了?
如果该值没有被评估/未转义,为什么\"
变成双引号?
(注意:我知道我可以通过例如修剪尾随反斜杠等来解决这个问题。我请求帮助理解为什么这些参数似乎是部分地评估)
诚然,这与 Microsoft C 命令行参数有关,但我已经测试过,C# 也遵循这些规则。命令行参数分为string args[]
数组在传递给应用程序之前。
解析 C 命令行参数
参数由空格分隔,空格可以是空格,也可以是制表符。
用双引号括起来的字符串将被解释为单个参数,无论其中是否包含空格。带引号的字符串可以嵌入到参数中。请注意,插入符号 (^) 不会被识别为转义字符或分隔符。
前面有反斜杠 \" 的双引号被解释为文字双引号 (")。
反斜杠按字面意思解释,除非它们紧接在双引号之前。
如果偶数个反斜杠后跟双引号,则每对反斜杠 (\) 都会在 argv 数组中放置一个反斜杠 (),并且双引号 (") 被解释为字符串分隔符。
如果奇数个反斜杠后面跟着一个双引号,则每对反斜杠 (\) 都会在 argv 数组中放置一个反斜杠 (),并且双引号会被剩余的反斜杠解释为转义序列,从而导致要放置在 argv 中的文字双引号 (")。
这些规则似乎与您所看到的结果一致。
我运行以下控制台应用程序来测试这些规则:
static void Main(string[] args)
{
foreach (string s in args)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
使用以下命令行参数:
arg1 "arg2 arg3" arg4\" "arg5\"" arg6\\\"
Output:
arg1
arg2 arg3
arg4"
arg5"
arg6\"
您输入参数的原因似乎未转义是第一个双引号被解释为起始字符串分隔符,第二个双引号由前面的反斜杠转义并解释为文字双引号 - 而不是结束分隔符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)