我想使用Start-Process
从PS调用一个程序,并将一堆参数传递给该程序应在后台处理的调用。
有时可能会发生,该程序提供的参数的总列表可能是数百个(总共200-300个),每个参数长度最多为32个字节string
。我试图了解-ArgumentList
的最大长度,但到目前为止找不到任何参考。
我怀疑我会遇到任何问题我会提供多少参数,但它确实让我感到烦恼,有多少参数或者-ArgumentList
参数实际上有多长?
答案 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多个字符)的参数。