我想使用Start-Process
从PS调用程序并将一堆参数传递给该调用,该程序应该在后台处理。
偶尔可能发生的是,该程序提供的参数的总列表可能是数百个(总共200-300个),每个都是长度最多为32个字节的string
。我试图找出-ArgumentList
的最大长度,但到目前为止找不到任何参考。
我怀疑我会遇到任何问题我会提供多少参数,但它确实让我感到烦恼,有多少参数或总共多长时间-ArgumentList
参数实际上是多少?
结合长度为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个项目的数组作为参数列表。
我发现使用-Credential
参数作为Start-Process
命令的一部分时,长度限制明显减少。如果我超过大约900个字符,我会得到“参数不正确”。不到那个,它工作正常。
没有使用-Credential
,我已经能够提交一个更长,更长(6000多个字符)的参数。