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

Adw*_*yth 1 powershell

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

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

我怀疑我会在提供的参数数量方面遇到任何问题,但它确实让我感到困扰,-ArgumentList参数实际上可能有多少个参数或总共多长时间?

Tes*_*ler 6

可能是 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
Run Code Online (Sandbox Code Playgroud)

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

但是如果我稍微移动一下数字,(2..1852|%{$_*100})那么它会更快地失败。建议重要的不是参数的数量,而是组合结果的字符串长度。

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

谷歌搜索8165 limit cmd并获得:

命令行字符串的最大长度

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

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

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

300 * 32 会打破那个。

但是话又说回来,如果您已经有一个可以处理它的程序 - start-process 似乎没有问题,将 1,800 个项目的数组作为参数列表。