命令行字符串的最大长度

在 Windows 中,命令行字符串的最大长度是多少?也就是说,如果我指定一个程序,它在命令行中接受参数,比如 abc.exe -name=abc

我写的一个简单的控制台应用通过命令行获取参数,我想知道允许的最大值是多少。

131125 次浏览

来自 Microsoft 文档: 命令提示符(Cmd.exe)命令行字符串限制

在运行 Windows XP 或更高版本的计算机上,您可以在命令提示符下使用的字符串的最大长度为8191个字符。

对不起,挖出了一个旧的线程,但我认为 Sunetos 的回答是不正确的(或不是完整的答案)。我做了一些实验(在 c # 中使用 ProcessStartInfo) ,似乎命令行命令的“参数”字符串在 XP 中被限制为2048个字符,在 Win7中被限制为32768个字符。我不知道8191限制是什么意思,但我还没有找到任何证据。

作为@Sugrue,我也在挖掘一条旧线索。

为了解释为什么有32768(我认为应该是32767,但让我们相信实验测试结果)字符限制,我们需要深入研究 Windows API。

无论你如何启动程序与命令行参数它去 执行创建过程或任何扩展他们的版本。这些 API 基本上包装了其他没有正式文档记录的 NT 级 API。据我所知,这些调用包装 NtCreateProcess,它需要 对象 _ 属性结构作为参数,以创建使用 InitializeObjectAttritribute 初始化对象属性的结构。在这个地方我们看到 UNICODE_STRING。现在让我们来看看这个结构:

typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR  Buffer;
} UNICODE_STRING;

它使用 USHORT(16位长度[0; 65535])变量来存储长度。根据 这个,长度表示以字节为单位的大小,而不是以字符为单位的大小。所以我们有: 65535 / 2 = 32767(因为 WCHAR是2字节长)。

有几个步骤可以深入研究这个数字,但我希望它是明确的。


另外,要支持@sunetos,请回答接受的内容。8191是允许输入 cmd.exe的最大数字,如果超过这个限制,就会产生 The input line is too long.错误。因此,尽管 cmd.exe不是传递新进程参数的唯一方法,但是答案是正确的。

在 Windows10中,它仍然是8191个字符... 至少在我的机器上是这样。

它只是删除8191个字符后的任何文本。事实上,我有8196个字符,在8196之后,它就不让我再打字了。

下面的脚本将测试您可以使用多长的语句。

echo 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