imm*_*le2 3 windows powershell cmd batch-file
根据相关问题和一些谷歌搜索/测试,很明显命令行的最大长度cmd.exe是8,191字符。然而......我的脚本似乎成功地超过了这个长度,我不明白它为什么有效。
所以我有:
.ps1.bat.bat- 似乎没有任何问题$encoded删除- 很容易看到 的长度/内容已被截断...但它按预期工作@echo off.bat$encoded我意识到这是一个有点奇怪的问题,因为我试图确定一些关于有效的东西与坏的东西的隐藏真相,但我想了解它为什么有效!
注意:
我为脚本创建 的主要原因.bat是因为我有许多小“程序”,需要在工作计算机上运行并与其他人共享。我们公司的执行策略不允许运行脚本,如果它是 a ,其他人使用我写的东西会更容易,.bat因为他们不需要理解/使用PowerShell. 他们只需将其放置.bat在正确的位置,单击两次,然后坐下来放松,直到发生事情。
编辑:这是窗口中被截断的命令cmd.exe。如果我从 Base64 转换回可读文本,它显然会丢失大约一半的脚本。然而 - 我没有注意到任何问题

-8191字符限制适用于交互式命令行和调用 的CLIcmd.exe(通过)cmd /c
它不适用于从批处理文件调用的命令- 限制接近[1] 32KiB ( 32,768) 个字符。
cmd.exe内部命令,例如echo; 相比之下,对外部程序的调用不受影响powershell.exe(尽管特定外部程序可能有自己的下限)。作为旁白:
尽管将 PowerShell 脚本转换为批处理文件的链接方法很聪明,但生成的批处理文件缺乏对传递给 PowerShell 代码的参数的支持,并且添加对此的支持是不切实际的(它也需要对参数进行 Base64 编码) ,在调用时,这在批处理文件中是不可能的,除非借助非内置实用程序)。
如果您的脚本/批处理文件被写入不需要调用参数或以交互方式提示它们(如您的情况),则无需担心此限制。
但是,您可能出于以下任何原因需要论证支持:
cmd.exe(命令提示符)调用批处理文件。Run对话框 ( WinKey-R)。至于将 PowerShell 代码包装在批处理文件中的总体原因:
.cmd, ) 可以直接.bat启动,就像它们是系统范围内的可执行文件一样。.ps1功能,必须通过显式调用 PowerShell CLI 从 PowerShell 外部调用该脚本;请注意,系统可能会配置为明确阻止.ps1脚本的执行 - 请参阅下一节。如果您的批处理文件中确实需要参数支持,最好但不方便的解决方案是分发两个文件:
*.ps1文件...*.ps1powershell.exe例如foo.cmd将伴随foo.ps1, 具有以下不变的内容:
@powershell.exe -NoProfile -File "%~dpn0.ps1" %*
Run Code Online (Sandbox Code Playgroud)
笔记:
重要提示:上面假设有效的 PowerShell执行策略允许执行脚本文件 ( .ps1)。
-ExecutionPolicy RemoteSigned之前放置-NoProfile(或者,要停用所有检查,请使用-ExecutionPolicy Bypass),但请注意,基于 GPO(组策略对象)的执行策略仍可能阻止脚本执行。要改为调用PowerShell (Core) 7+,请使用pwsh.exe代替powershell.exe.
%~dpn0扩展为封闭批处理文件本身的完整路径,不带文件扩展名;因此,追加的.ps1目标是同一目录中的配套 PowerShell 脚本;运行cmd /c call /?以获得语法解释。
%*传递批处理文件接收到的所有参数。
[1] 实际上,限制似乎是:批处理文件中的32,767字符数,以及 - 减少 3 个字符。-对于Powershell(在命令行/通过 CLI 和脚本中)。在 PowerShell 中,该限制实际上可能比这个值还要低,因为 PowerShell 将其通过后台构建的命令行中找到的可执行文件的完整路径扩展为可执行文件的名称,但事实并非如此。32,764*.ps1$env:PATHcmd.exe
| 归档时间: |
|
| 查看次数: |
445 次 |
| 最近记录: |