当参数中的最后一个字符是 \" 时,args.Length 从 cmd.exe 错误打印
args.Length prints incorrectly from cmd.exe when last character in argument is a \"
使用 Visual Studio 2013 社区版创建控制台应用程序。在Main方法下写一行代码。从命令提示符调用程序。
static void Main(string[] args)
{
Console.WriteLine(args.Length);
用两个参数调用程序。在 Windows 10 中,它打印 1。
"C:\Users\MacGyver\Documents\Visual Studio 2013\Projects\ArgsProblem\ArgsProblem\bin\Debug\ArgsProblem.exe" "C:\" a2
编辑:
如果第一个参数在引号内且字符串中的最后一个字符是 \
,则长度变为 1。这导致 args 的长度为 1。为什么会这样?我意识到 \"
表示 C# 字符串中的引号,但为了使控制台应用程序直观,最好修复代码中的错误,而不是强迫最终用户记住添加额外的 \
在 \"
之前正确转义命令行实用程序中的反斜杠。
损坏(args.Length = 1):
"C:\Users\MacGyver\Documents\Visual Studio 2013\Projects\ArgsProblem\ArgsProblem\bin\Debug\ArgsProblem.exe" "C:\" a2
未损坏(args.Length = 2):
"C:\Users\MacGyver\Documents\Visual Studio 2013\Projects\ArgsProblem\ArgsProblem\bin\Debug\ArgsProblem.exe" "C:" a2
您展示的是简单的 Windows 命令行行为。 \
表示双引号不结束字符串(即参数)。尝试 运行 一个程序来准确显示参数是如何处理的。在我的 Windows 10 电脑上我尝试了这个程序:
static void Main(string[] args)
{
Console.WriteLine("There are {0} arguments", args.Length);
int argIndex = 0;
foreach (string ss in args)
{
Console.WriteLine(" {0,3}: '{1}'", argIndex, ss);
argIndex++;
}
}
它给出了这些输出。请注意,\
转义了双引号,但它不是结果字符串的一部分。
C:\>showarguments ab c
There are 2 arguments
0: 'ab'
1: 'c'
C:\>showarguments "C:\" a2
There are 1 arguments
0: 'C:" a2'
C:\>showarguments "C:" a2
There are 2 arguments
0: 'C:'
1: 'a2'
使用 Visual Studio 2013 社区版创建控制台应用程序。在Main方法下写一行代码。从命令提示符调用程序。
static void Main(string[] args)
{
Console.WriteLine(args.Length);
用两个参数调用程序。在 Windows 10 中,它打印 1。
"C:\Users\MacGyver\Documents\Visual Studio 2013\Projects\ArgsProblem\ArgsProblem\bin\Debug\ArgsProblem.exe" "C:\" a2
编辑:
如果第一个参数在引号内且字符串中的最后一个字符是 \
,则长度变为 1。这导致 args 的长度为 1。为什么会这样?我意识到 \"
表示 C# 字符串中的引号,但为了使控制台应用程序直观,最好修复代码中的错误,而不是强迫最终用户记住添加额外的 \
在 \"
之前正确转义命令行实用程序中的反斜杠。
损坏(args.Length = 1):
"C:\Users\MacGyver\Documents\Visual Studio 2013\Projects\ArgsProblem\ArgsProblem\bin\Debug\ArgsProblem.exe" "C:\" a2
未损坏(args.Length = 2):
"C:\Users\MacGyver\Documents\Visual Studio 2013\Projects\ArgsProblem\ArgsProblem\bin\Debug\ArgsProblem.exe" "C:" a2
您展示的是简单的 Windows 命令行行为。 \
表示双引号不结束字符串(即参数)。尝试 运行 一个程序来准确显示参数是如何处理的。在我的 Windows 10 电脑上我尝试了这个程序:
static void Main(string[] args)
{
Console.WriteLine("There are {0} arguments", args.Length);
int argIndex = 0;
foreach (string ss in args)
{
Console.WriteLine(" {0,3}: '{1}'", argIndex, ss);
argIndex++;
}
}
它给出了这些输出。请注意,\
转义了双引号,但它不是结果字符串的一部分。
C:\>showarguments ab c
There are 2 arguments
0: 'ab'
1: 'c'
C:\>showarguments "C:\" a2
There are 1 arguments
0: 'C:" a2'
C:\>showarguments "C:" a2
There are 2 arguments
0: 'C:'
1: 'a2'