Start-Process cmdlet的-ArgumentList参数的最大长度是多少

问题描述 投票:0回答:2

我想使用Start-Process从PS调用程序并将一堆参数传递给该调用,该程序应该在后台处理。

偶尔可能发生的是,该程序提供的参数的总列表可能是数百个(总共200-300个),每个都是长度最多为32个字节的string。我试图找出-ArgumentList的最大长度,但到目前为止找不到任何参考。

我怀疑我会遇到任何问题我会提供多少参数,但它确实让我感到烦恼,有多少参数或总共多长时间-ArgumentList参数实际上是多少?

powershell
2个回答
3
投票

结合长度为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并得到:

Maximum Length of Command Line String

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

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

所以,要么是8191个字符,要么......这可能取决于你正在调用的程序。

300 * 32会破坏这一点。

但话说回来,如果你已经有了一个可以处理它的程序 - 启动过程似乎没有问题,一个包含1800个项目的数组作为参数列表。


1
投票

我发现使用-Credential参数作为Start-Process命令的一部分时,长度限制明显减少。如果我超过大约900个字符,我会得到“参数不正确”。不到那个,它工作正常。

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

© www.soinside.com 2019 - 2024. All rights reserved.