Answers:
从Microsoft文档:命令提示符(Cmd.exe)命令行字符串限制
在运行Microsoft Windows XP或更高版本的计算机上,可以在命令提示符下使用的最大字符串长度是8191个字符。
很抱歉,我想出一个旧的主意,但我认为sunetos的答案不正确(或者不是完整答案)。我做过一些实验(在c#中使用ProcessStartInfo),似乎命令行命令的'arguments'字符串在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,请回答接受的内容。8191是允许输入的最大数字cmd.exe
,如果超出此限制,The input line is too long.
则会生成错误。因此,尽管这cmd.exe
不是传递新过程参数的唯一方法,但答案是正确的。
ObjectAttributes
仅用于安全描述符,并使返回的句柄可继承。命令行在ProcessParameters
过程环境模块(PEB)引用的中传递。对于旧版本NtCreateProcess
,必须通过将这些参数写入子进程NtWriteVirtualMemory
。如今NtCreateUserProcess
使用,它结合了几个电话,以一个单一的内核服务-例如创建Section
,Process
和Thread
对象; 并编写过程参数。
CreateProcessW
在命令行和应用程序路径中使用以空值结尾的字符串。限制为32,767-1,即32,766个字符。
CreateProcessW
,它可以在UNICODE_STRING
结构中存储确切的长度,并将两者Length
和都设置MaximumLength
为65,534 ,这是法律依据NtCreateProcess
。
在Windows 10中,至少在我的机器上仍为8191个字符。
它只会截断8191个字符后的所有文本。好吧,实际上,我得到了8196个字符,而在8196之后,则不再允许我输入任何字符。
这是一个脚本,它将测试您可以使用多长时间的语句。好吧,假设您已安装gawk / awk。
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