Start-Process命令的-ArgumentList参数的最大长度是多少?

4
我想使用Start-Process来调用一个程序并传递一堆参数给该程序以在后台处理。偶尔可能出现的情况是,向该程序提供的总参数列表可能有数百个(大约总共200到300个),每个参数都是最多32个字节长度的字符串。我尝试了解-ArgumentList的最大长度,但迄今为止还没有找到任何参考资料。我怀疑我会遇到任何供应的参数量的问题,但是它令我困扰,实际上-ArgumentList参数可能有多少参数或多长?

参数列表是一个对象数组。本质上没有任何限制。如果您遇到问题,它们不会来自于参数数量 - David Brabant
@DavidBrabant 我的猜测是,Start-Process 将参数组合成一个带有空格和引号格式的字符串,因此 200-300 * (32 + 1) 大约会有 6000-9000 个字符。这将是任何 Windows 命令行可能具有的最大长度,但我迄今为止还没有找到任何资源,所以我认为这可能值得在 Stack 上提问。 - Adwaenyth
1
请返回翻译文本:https://blogs.msdn.microsoft.com/oldnewthing/20031210-00/?p=41553https://blogs.msdn.microsoft.com/oldnewthing/20031211-00/?p=41543 - David Brabant
1
@DavidBrabant 在尝试了TessellatingHeckler的答案后,我得出了相同的结论。在Win10机器上,最大长度是包括程序可执行文件名在内的总输入字符串长度为32,767。 - Adwaenyth
2个回答

7

总长度为8191个字符,也许是这样的。或者这取决于您正在运行的程序。

来源:试错(Windows 8.1 / PSv4):

Start-Process -FilePath cmd -ArgumentList (@('/k','echo 1') + (2..1852))
# works

Start-Process -FilePath cmd -ArgumentList (@('/k','echo 1') + (2..1853))
# doesn't work

在大约6769处触发异常:
PS C:\> Start-Process -FilePath cmd -ArgumentList (@('/k','echo 1') + (2..6768))
Start-Process : This command cannot be run due to the error: The filename or extension is too long.
At line:1 char:1
+ Start-Process -FilePath cmd -ArgumentList (@('/k','echo 1') + (2..676 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

但是,如果我稍微调整一下数字(2..1852|%{$_*100}),那么它就会更早失败。这表明重要的不是参数数量,而是组合结果的字符串长度。

((@('/k','echo 1') + (2..1852)) -join " ").Length
# 8160 when it works, 8165 when it breaks

请在谷歌上搜索8165 limit cmd并获得以下结果:

命令行字符串的最大长度

https://support.microsoft.com/en-gb/kb/830473

在运行 Microsoft Windows XP 或更高版本的计算机上,您可以在命令提示符中使用的字符串的最大长度为8191个字符。因此,要么是8191个字符,要么...也许这取决于您调用的程序。300 * 32 将会超过这个限制。但是,如果您已经有一个可以处理它的程序 - start-process 似乎没有问题将1,800个项目的数组作为参数列表。

1
在 Windows 10 pro 1607 上测试了一下,似乎存在一个限制,总长度大约为32,767个字符(异常情况在32,742处稍微抛出了一些,但目前还没有弄清原因) - 考虑到参数列表确实会拼接成一个以空格分隔的字符串。因此它看起来也与操作系统有关。所以你可能需要更新你的答案。 - Adwaenyth

3

我发现,在使用-Credential参数作为Start-Process命令的一部分时,长度限制显著减少。如果超过约900个字符,我会得到“参数不正确”的提示。少于这个长度就可以正常工作。

如果不使用-Credential,我已经能够提交一个远远更长的参数(6000多个字符)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接