【问题标题】:What is the maximum length of the -ArgumentList parameter of the Start-Process cmdletStart-Process cmdlet 的 -ArgumentList 参数的最大长度是多少
【发布时间】:2016-11-10 07:11:31
【问题描述】:

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

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

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

【问题讨论】:

  • 参数列表是一个对象数组。本身不应该有任何限制。如果你有问题,它们不会来自 number 个参数。
  • @DavidBrabant 我的猜测是,Start-Process 将参数组合成一个用空格和引号格式化的字符串,所以 200-300 * (32 + 1) 大概是 6000-9000 个字符.因此,这将是任何 Windows 命令行可以具有的最大长度,但到目前为止我还没有找到任何资源,所以我认为这可能值得一个堆栈问题。
  • @DavidBrabant 是的,在对 TessellatingHeckler 的回答进行了一些测试之后,我会得出同样的结论。最大长度是 32,767 的总输入字符串,包括程序可执行文件名称 - 至少在 Win10 机器上。

标签: powershell


【解决方案1】:

可能是 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 for 8165 limit cmd 并获取:

Maximum Length of Command Line String

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

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

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

300 * 32 会破坏它。

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

【讨论】:

  • 在 Windows 10 pro 1607 上对其进行了测试,它似乎是一个大约 32,767 的限制(异常被抛出略低于 32,742,到目前为止还没有弄清楚为什么)字符总长度 - 考虑到参数列表确实会加入空格分隔的字符串。所以它似乎也依赖于操作系统。所以你可能想更新你的答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-08-12
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多