命令行string的最大长度
在Windows中,命令行string的最大长度是多less? 这意味着如果我指定一个程序在命令行上使用参数,如abc.exe -name=abc
我写的一个简单的控制台应用程序通过命令行参数,我想知道什么是最大允许量。
在运行Microsoft Windows XP或更高版本的计算机上,可在命令提示符处使用的最大string长度为8191个字符。
– Microsoft支持知识库文章830473
对不起,挖出一个旧线程,但我认为sunetos的答案是不正确的(或不是完整的答案)。 我已经做了一些实验(在C#中使用ProcessStartInfo),似乎命令行命令的“参数”string限制为XP中的2048个字符和Win7中的32768个字符。 我不确定8191限制是指什么,但我还没有find任何证据。
作为@Sugrue我也挖出一个旧的线程。
为了解释为什么有32768(我认为它应该是32767,但让我们相信实验testing结果)字符的限制,我们需要挖掘到Windows API。
不pipe你如何用命令行参数启动程序,它都会去ShellExecute , CreateProcess或者任何扩展它们的版本。 这些API基本上包装了未正式logging的其他NT级API。 据我所知这些调用包装NtCreateProcess ,需要OBJECT_ATTRIBUTES结构作为参数,创build该结构InitializeObjectAttributes被使用。 在这个地方我们看到UNICODE_STRING
。 所以现在让我们看看这个结构:
typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING;
它使用USHORT
(16位长度[0; 65535])variables来存储长度。 据此,长度表示以字节为单位的大小,而不是字符。 所以我们有: 65535 / 2 = 32767
(因为WCHAR
是2个字节长)。
有几个步骤来挖掘这个数字,但我希望是明确的。
另外,要支持@sunetos回答接受什么。 8191是允许input到cmd.exe
的最大数量,如果超过此限制,则The input line is too long.
错误生成。 所以,答案是正确的,尽pipecmd.exe
并不是传递新进程参数的唯一方法。