5 powershell cmd max
我正在创建一个 PowerShell,它使用以下命令运行一个简单的 Java 程序:
Start-Process -filepath .\java.exe -ArgumentList "Input" -NoNewWindow
Run Code Online (Sandbox Code Playgroud)
在本例中,Input 类只是接受并打印一个字符串。
我期望长度大于cmd.exe
8191 个字符限制的字符串,因此我需要在 PS 中运行它。
当前场景:
Input
接受大于 8191 个字符的字符串。我-Wait
也尝试添加,但运气不佳。
任何想法?
正如你所说,最大。交互式命令行的长度(在交互式命令提示符下,但不在cmd.exe
批处理文件中)正式为8,191
字符- 请参阅文档。如果您尝试通过“运行”对话框 ( ) 提交命令行WinKey-R,则限制似乎更低。
但是,这不适用于PowerShell中的命令行,无论是在交互式提示符下还是在.ps1
文件中(其中限制要高得多)32,764
字符。[1]
换句话说:从PowerShell中启动的命令不受-character限制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
字符限制。(但是,在批处理文件中,该限制仅适用于的内部(内置)命令,例如;对外部程序的调用实际上允许为chars.long)。.cmd
.bat
cmd.exe
echo
32,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’无法运行:文件名或扩展名太长”。
据推测,该限制最终是由CreateProcess
WinAPI 函数强加的,其文档声明:“此字符串的最大长度是32,767
字符,包括 Unicode 终止空字符”。然而,即使考虑到在幕后使用的额外终止空字符,37,764 + 1
也是32,765
,而且我不知道其余2
字符的解释。
归档时间: |
|
查看次数: |
6514 次 |
最近记录: |