我正在创建一个PowerShell,它运行一个简单的Java程序:
Start-Process -filepath .java.exe -ArgumentList "Input" -NoNewWindow
在这种情况下,Input 类只是接受并打印一个字符串。
我希望字符串的长度大于cmd.exe
8191 个字符的限制,所以我需要在 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 的可执行文件和大多数本机编译的可执行文件能够接收高达 PowerShell
32,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'无法运行:文件名或扩展名太长".
据推测,限制最终是由CreateProcess
WinAPI 函数施加的,其文档指出:"此字符串的最大长度为32,767
个字符, 包括 Unicode 终止空字符"。但是,即使考虑到幕后使用的额外终止空字符,37,764 + 1
也是32,765
,我不知道剩下的2
字符是什么原因。