电源外壳,以避免cmd 8191字符限制



我正在创建一个PowerShell,它运行一个简单的Java程序:

Start-Process -filepath .java.exe -ArgumentList "Input" -NoNewWindow

在这种情况下,Input 类只是接受并打印一个字符串。

我希望字符串的长度大于cmd.exe8191 个字符的限制,所以我需要在 PS 中运行它。

当前方案:

  • 在 PS 中直接运行上述命令即可,Input接受大于 8191 个字符的字符串。
  • 将命令保存在 ps1 文件中并运行它,会出现一个 PS 窗口,但 cmd 在达到 8191 个字符限制时在后台运行。

我也尝试添加-Wait,但不是运气。

知道吗?

如您所述,交互式命令行的最大长度为cmd.exe(在交互式命令提示符下,但不在批处理文件中(正式8,191字符- 请参阅文档。 如果尝试通过"运行"对话框 (WinKey-R( 提交命令行,则限制似乎更低。

但是,这不适用于PowerShell 中的命令行 - 无论是在交互式提示符下还是在限制要高得多的.ps1文件中 -32,764字符[1]

换句话说:从 PowerShell启动的命令不受8,191字符限制的约束(除非它们自己施加自己的限制,例如,对cmd.exe /c的调用会施加限制( - 无论您使用的是Start-Process还是Invoke-Expression(您都不应该使用它们来调用控制台应用程序/脚本 - 请参阅此答案和此答案(或通过直接调用(通过文件路径,可能前面有&,调用运算符 - 例如,.javaRun.ps1& .javaRun.ps1( - 这些方法都不涉及cmd.exe

至于从PowerShell调用外部程序

  • .基于 NET 的可执行文件和大多数本机编译的可执行文件能够接收高达 PowerShell32,764个字符限制的命令行。

  • 相反,如果目标可执行文件恰好是cmd.exe(通过cmd /c执行的命令行(,它将再次施加总体8,191字符限制。(但是,在批处理文件中-.cmd.bat- 该限制仅适用于cmd.exe的内部(内置(命令,例如echo;对外部程序的调用实际上允许32,766字符长(。

  • 我不知道使用不同运行时的可执行文件,例如java.exe;但如果它们成为瓶颈,您将无法从PowerShell克服此问题,而是必须找到一种不同的方式将输入传递给目标程序,例如通过标准输入或辅助文件。


[1] 我没有官方参考,但你可以按如下方式通过实验验证限制C:Windowssystem32choice.exe /d y /t 0 /m ('x' * (32764-44)) 2>$null.-44减去命令的静态前缀的长度,并创建尽可能多的x字符32,764。调用成功(从某种意义上说,它已成功提交并实际调用choice.exe,无论它随后是否报告错误(,并且不产生任何输出(附带的stderr输出,2>$null丢弃(。如果仅将长度增加 1 个字符(将-44更改为-43(,则调用会从根本上中断,"程序'选择.exe'无法运行:文件名或扩展名太长".
据推测,限制最终是由CreateProcessWinAPI 函数施加的,其文档指出:"此字符串的最大长度为32,767个字符, 包括 Unicode 终止空字符"。但是,即使考虑到幕后使用的额外终止空字符,37,764 + 1也是32,765,我不知道剩下的2字符是什么原因。

最新更新