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

Powershell Start Process cmdlet的-ArgumentList参数的最大长度是多少,powershell,Powershell,我想使用Start Process从PS调用一个程序,并将一组参数传递给该调用,该调用表示该程序应该在后台处理 有时可能会出现这样的情况,即为该程序提供的参数的总列表可能有数百个(大约总共200-300个),每个参数又是一个长度高达32字节的字符串。我试图找出-ArgumentList的最大长度,但到目前为止找不到任何参考 我怀疑我在提供的参数数量上会遇到任何问题,但这确实让我感到困扰,-ArgumentList参数实际有多少个参数,或者总共有多长?组合长度可能是8191个字符。或者这取决于你正

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

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


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

组合长度可能是8191个字符。或者这取决于你正在运行的程序

来源:试用和错误(Windows 8.1/PSv4):

大约在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 |%{$\u*100})
,那么它会更快失败。这表明重要的不是参数的数量,而是组合结果的字符串长度

((@('/k','echo 1') + (2..1852)) -join " ").Length
# 8160 when it works, 8165 when it breaks
谷歌搜索
8165 limit cmd
并获取:

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

所以,8191个字符或者。。。也许这取决于你打电话的节目

300*32会打破这个


但是,同样,如果您已经有了一个可以处理它的程序,那么启动过程似乎可以将1800个项目的数组作为参数列表。

可能是8191个字符的组合长度。或者这取决于你正在运行的程序

来源:试用和错误(Windows 8.1/PSv4):

大约在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 |%{$\u*100})
,那么它会更快失败。这表明重要的不是参数的数量,而是组合结果的字符串长度

((@('/k','echo 1') + (2..1852)) -join " ").Length
# 8160 when it works, 8165 when it breaks
谷歌搜索
8165 limit cmd
并获取:

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

所以,8191个字符或者。。。也许这取决于你打电话的节目

300*32会打破这个


但是,同样,如果您已经有了一个可以处理它的程序,那么启动进程似乎对1800个项目的数组作为参数列表没有问题。

我发现,在使用
-Credential
参数作为
启动进程
命令的一部分时,长度限制要小得多。如果超过900个字符,我会得到一个“参数不正确”。小于此值,工作正常


在不使用
-Credential
的情况下,我可以提交一个非常长的参数(6000多个字符)。

我发现,在
-Credential
命令中使用
-Credential
参数时,长度限制明显减少。如果超过900个字符,我会得到一个“参数不正确”。小于此值,工作正常


不使用
-Credential
,我就能够提交一个非常长的参数(6000多个字符)。

参数列表是一个对象数组。本身不应该有任何限制。如果您有问题,它们不会来自参数的数量。@DavidBrabant我的猜测是,
Start Process
将参数组合成一个带空格和引号的字符串,因此200-300*(32+1)大约是6000-9000个字符。因此,这将是任何windows命令行可以拥有的最大长度,但我还没有找到任何资源,所以我认为这可能值得一提堆栈问题。还有@DavidBrabant是的,在用TessellingHeckler的答案测试了一下之后,我会得出同样的结论。最大长度为32767的总输入字符串,包括程序可执行文件名-至少在Win10计算机上是这样。参数列表是一个对象数组。本身不应有任何限制。如果您有问题,它们不会来自参数的数量。@DavidBrabant我的猜测是,
Start Process
将参数组合成一个带空格和引号的字符串,因此200-300*(32+1)大约是6000-9000个字符。因此,这将是任何windows命令行可以拥有的最大长度,但我还没有找到任何资源,所以我认为这可能值得一提堆栈问题。还有@DavidBrabant是的,在用TessellingHeckler的答案测试了一下之后,我会得出同样的结论。最大长度是一个32767的总输入字符串,包括程序可执行文件名——至少在Win10机器上是这样。在Windows 10 pro 1607上进行了测试,它似乎在32767左右有一个限制(抛出的异常值略低于32742,目前还不清楚原因)字符总长度-考虑到参数列表确实会连接到一个空格分隔的字符串。因此,它似乎也依赖于操作系统。因此,您可能需要更新您的答案。在Windows 10 pro 1607上对其进行了测试,它似乎限制在32767个字符左右(异常被抛出,略低于32742个字符,目前还不知道为什么),考虑到参数列表确实会连接到一个空格分隔的字符串。因此,它似乎也依赖于操作系统。所以你可能想更新你的答案。