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

时间:2016-11-10 07:11:31

标签: powershell

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

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

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

2 个答案:

答案 0 :(得分: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

Google 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 :(得分:1)

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

在不使用-Credential的情况下,我已经能够提交一个更长,更长(6000多个字符)的参数。