Powershell避免cmd 8191字符限制

5 powershell cmd max

我正在创建一个 PowerShell,它使用以下命令运行一个简单的 Java 程序:

Start-Process -filepath .\java.exe -ArgumentList "Input" -NoNewWindow
Run Code Online (Sandbox Code Playgroud)

在本例中,Input 类只是接受并打印一个字符串。

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

当前场景:

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

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

任何想法?

mkl*_*nt0 4

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

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

换句话说:从PowerShell启动的命令不受-character限制8,191(除非它们本身强加了自己的限制,例如调用就cmd.exe /c会这样做) - 无论您是否使用Start-ProcessInvoke-Expression(您都不应该使用调用控制台应用程序/脚本 - 请参阅此答案此答案)或通过直接调用(通过文件路径,前面可能带有&调用运算符 - 例如,.\javaRun.ps1& .\javaRun.ps1) - 这些方法都不涉及cmd.exe

至于从 PowerShell调用外部程序

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

  • 相比之下,如果目标可执行文件恰好是cmd.exe(通过 执行的命令行cmd /c),会再次施加整体8,191字符限制。(但是,在批处理文件中,该限制仅适用于的内部(内置)命令,例如;对外部程序的调用实际上允许为chars.long)。.cmd.batcmd.exeecho32,766

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


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