命令行字符串的最大长度

100 windows command-line

在Windows中,命令行字符串的最大长度是多少?这意味着如果我指定一个在命令行上接受参数的程序,例如abc.exe -name=abc

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

sun*_*tos 79

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

- Microsoft支持知识库文章830473

  • 这仅适用于通过命令提示符实际运行的程序(根据问题).快捷方式(.lnk)限制为260个字符,CreateProcess限制为32767,ShellExecute限制为大约2048. [根据Raymond Chen关于此主题的文章](http://blogs.msdn.com/b/oldnewthing/archive/2003/一十分之一十二/ 56028.aspx) (31认同)
  • @ulrichb 现在,在另一次博客迁移之后,该链接也被破坏了。现在可以在 https://devblogs.microsoft.com/oldnewthing/20031210-00/?p=41553 找到引用的文章 (4认同)
  • 请注意,该文章的页脚说它适用于Microsoft Windows Server 2003 [数据中心版(32位x86),企业版(32位x86),标准版(32位x86)和网络版]; Microsoft Windows XP Home Edition; Microsoft Windows XP Professional; Microsoft Windows 2000 [高级服务器,专业版,服务器]; Microsoft Windows NT Server 4.0标准版; 和Microsoft Windows NT Workstation 4.0 Developer Edition. (3认同)
  • 陈的文章上面的链接被打破了.这是一个更新的:https://blogs.msdn.microsoft.com/oldnewthing/20031210-00/?p = 41553. (3认同)

Sug*_*rue 70

很抱歉挖掘旧线程,但我认为sunetos的答案不正确(或者不是完整答案).我做了一些实验(在c#中使用ProcessStartInfo),似乎命令行命令的'arguments'字符串在XP中限制为2048个字符,在Win7中限制为32768个字符.我不确定8191限制是指什么,但我还没有找到任何证据.

  • @LordTorgamus,32k限制是由于[UNICODE_STRING](http://msdn.microsoft.com/en-us/library/windows/desktop/aa380518%28v=vs.85%29.aspx)结构(ushort length) ).[根据Raymond Chen关于这个主题的文章](http://blogs.msdn.com/b/oldnewthing/archive/2003/12/10/56028.aspx)CMD将行限制为8192个字符(我假设是return是最后一个字符),ShellExecuteEx限制为"INTERNET_MAX_URL_LENGTH(2048左右)" (10认同)
  • 在 Windows 10 上的 PowerShell 下呢? (3认同)
  • 8191 for cmd 和类似的东西看起来很真实,只是在 MSBuild 中通过 Exec 运行很长的命令时遇到了这个问题 (2认同)

ST3*_*ST3 37

作为@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;
Run Code Online (Sandbox Code Playgroud)

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

有几个步骤可以深入研究这个数字,但我希望很清楚.


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

  • 长度最多为 32,766 个字符,因为存储了一个以空字符结尾的字符串。 (3认同)

Jos*_*wey 5

在 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
Run Code Online (Sandbox Code Playgroud)

  • 这是 cmd.exe 的限制。正如上面的答案所说,由于 UNICODE_STRING,实际限制是 32,768 个字符。 (2认同)