在Windows中,命令行字符串的最大长度是多少?也就是说,如果我指定一个需要在命令行上使用参数的程序,例如abc.exe -name=abc
。
我编写了一个简单的控制台应用程序通过命令行接受参数,现在我想知道允许的最大数量是多少。
答案:
在Windows中,命令行字符串的最大长度为8191个字符。这包括命令本身以及任何传递给该命令的参数。请注意,这里所说的字符数限制特指ANSI字符集中的字符数,而不是Unicode字符集中的字符数。
在Windows中,命令行字符串的最大长度是多少?也就是说,如果我指定一个需要在命令行上使用参数的程序,例如abc.exe -name=abc
。
我编写了一个简单的控制台应用程序通过命令行接受参数,现在我想知道允许的最大数量是多少。
在Windows中,命令行字符串的最大长度为8191个字符。这包括命令本身以及任何传递给该命令的参数。请注意,这里所说的字符数限制特指ANSI字符集中的字符数,而不是Unicode字符集中的字符数。
根据微软文档: 命令提示符(Cmd.exe)命令行字符串限制
在运行Microsoft Windows XP或更高版本的计算机上,您可以在命令提示符处使用的字符串最大长度为8191个字符。
抱歉挖掘了一个老帖子,但我认为 sunetos 的回答 不正确(或不是完整的答案)。我做了一些实验(使用 c# 中的 ProcessStartInfo),似乎在 XP 中命令行命令的“参数”字符串限制为 2048 个字符,在 Win7 中为 32768 个字符。我不确定 8191 的限制指的是什么,但我还没有找到任何证据。
像@Sugrue一样,我也正在挖掘一条旧线程。
为了解释为什么有32768(我认为应该是32767,但让我们相信实验测试结果)个字符的限制,我们需要深入研究Windows API。
无论您如何使用命令行参数启动程序,它都会进入ShellExecute、CreateProcess或任何扩展版本。这些API基本上包装了其他未被官方记录的NT级API。据我所知,这些调用包装了NtCreateProcess,它需要OBJECT_ATTRIBUTES结构作为参数,为了创建该结构,将使用InitializeObjectAttributes。在这个地方,我们看到了UNICODE_STRING
。现在让我们来看看这个结构:
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
它使用USHORT
(16位长度[0; 65535])变量存储长度。 根据这里,长度表示字节数而不是字符数。 所以我们有:65535 / 2 = 32767
(因为WCHAR
长度为2个字节)。
需要深入挖掘几个步骤,但我希望这很清楚。
此外,为了支持@sunetos的答案,最大允许输入cmd.exe
的数字是8191,如果超过此限制,则会生成输入行太长
错误。 因此,尽管cmd.exe
不是传递新进程参数的唯一方式,但答案是正确的。
CreateProcessW
对于命令行和应用程序路径使用以空字符结尾的字符串。限制为32,767-1,即32,766个字符。 - Eryk Sunecho rem this is a test of how long of a line that a .cmd script can generate >testbat.bat
gawk 'BEGIN {printf "echo -----";for (i=10;i^<=100000;i +=10) printf "%%06d----",i;print;print "pause";}' >>testbat.bat
testbat.bat