将 .ps1 转换为 .bat 不会导致 cmd.exe 达到最大字符长度 - 但为什么呢?

2023-12-11

基于一个相关问题和一些谷歌搜索/测试,很明显命令行的最大长度cmd.exe is 8,191人物。然而......我的脚本似乎成功地超过了这个长度,我不明白它为什么有效。

所以我有:

  • 编写/保存为的脚本.ps1
  • I'm 转换它到一个.bat使用来自的方法将 PowerShell 转换为批处理
  • 如果我运行.bat- 似乎没有任何问题
  • 如果我尝试回应$encoded命令或只是删除@echo off在运行之前.bat- 很容易看出的长度/内容$encoded已被截断...但它按预期工作

我意识到这是一个有点奇怪的问题,因为我试图确定一些关于有效的东西与损坏的东西的隐藏真相,但我想了解why这是工作!

Note:我创建的主要原因.bat我的脚本是因为我有许多小“程序”,我需要在我的工作计算机上运行并与其他人共享。我们公司的执行政策不允许运行脚本,如果它是一个脚本,其他人使用我写的东西会容易得多.bat因为他们不需要理解/使用PowerShell。他们只需将.bat在正确的位置,点击两下,然后坐下来放松,直到有事情发生。

EDIT: Here's the truncated command in the cmd.exe window. If I convert from Base64 back to readable text, it is clearly missing about half of the script. Yet - I'm not noticing any problems Truncated Command


  • The 8191- 字符限制适用于交互式命令行并致电cmd.exe's CLI (via cmd /c)

  • It does not apply to commands invoked from batch files - there the limit is close to[1] 32KiB (32,768) characters.

    • 然而,它似乎仍然有选择地适用于cmd.exe's internal命令,例如echo;相比之下,调用外部程序例如powershell.exe不受影响(尽管特定外部程序可能有自己的下限)。

作为旁白:

聪明如的链接方法将 PowerShell 脚本转换为批处理文件 is, 生成的批处理文件缺乏论据支持传递到 PowerShell 代码,并且添加对此的支持是不切实际的(它也需要对参数进行 Base64 编码,在调用时,除非借助非内置实用程序,否则从批处理文件中不可能实现这一点)。

  • 如果您的脚本/批处理文件被写入不需要调用参数或以交互方式提示它们(如您的情况),则无需担心此限制。

  • 然而,您可能出于以下任何原因需要论证支持:

    • 允许调用批处理文件cmd.exe(命令提示符)有参数.
    • To allow calling with arguments from other environments that support passing arguments, notably Task Scheduler and the Windows Run dialog (WinKey-R).
    • 使批处理文件支持拖放(隐式传递拖放文件的路径作为参数)。

至于将 PowerShell 代码包装在批处理文件中的总体原因:

  • 批处理文件(.cmd, .bat)可以启动directly,就好像它们是可执行文件一样,全系统.
  • 相比之下,这是not支持 PowerShell 脚本(.ps1),必须通过显式调用 PowerShell CLI 从外部 PowerShell 调用;请注意,系统可以配置为明确阻止执行.ps1脚本 - 请参阅下一节。

If you do批处理文件中需要参数支持,最好但不方便的解决方案是分发two files:

  • 原本的*.ps1 file...
  • and a 配套批处理文件,与相同的基本文件名,要放置在同一目录- 可以从以下位置调用outsidePowerShell - 其唯一目的是调用*.ps1文件通过powershell.exe带有传递参数。

E.g. foo.cmd会陪伴foo.ps1,具有以下不变的内容:

@powershell.exe -NoProfile -File "%~dpn0.ps1" %*

Note:

  • 重要的:以上假设PowerShell有效执行政策允许执行脚本文件(.ps1).

    • 如果你不能做出这个假设,请将-ExecutionPolicy RemoteSigned before -NoProfile上面(或者,要停用所有检查,-ExecutionPolicy Bypass),但请注意,执行策略基于GPO(组策略对象)仍可能阻止脚本执行。
  • To call PowerShell(核心)7+相反,使用pwsh.exe代替powershell.exe.

  • %~dpn0扩展为封闭批处理文件本身的完整路径没有文件扩展名;追加.ps1因此,将配套的 PowerShell 脚本定位在同一目录中;跑步cmd /c call /?语法的解释。

  • %*传递批处理文件接收到的所有参数。


[1] In practice, the limits appear to be: 32,767 characters in batch files, and - lower by 3 chars. - 32,764 for Powershell (both on the command line / via the CLI and in *.ps1 scripts). In PowerShell, the limit may in practice be even lower than that, because PowerShell expands the names of executables it locates via $env:PATH to their full paths in the command lines constructed behind the scenes, which cmd.exe doesn't do.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 .ps1 转换为 .bat 不会导致 cmd.exe 达到最大字符长度 - 但为什么呢? 的相关文章

  • 打开 PDF 到书签/指定目标?

    我正在尝试使用 python 打开特定书签的 PDF 到目前为止 我可以在命令提示符中运行以下命令并得到我想要的 last是 PDF test pdf 中指定目的地的名称 C Program Files x86 Adobe Reader 1
  • 是否可以调用驻留在 exe 中的非导出函数?

    我想调用驻留在第 3 方 exe 中的函数并获取其结果 好像有should是一种方法 只要我知道函数地址 调用约定等 但我不知道如何 有谁知道我会怎么做 我意识到任何解决方案都是非标准的黑客 但有must成为一种方式 我的非恶意用例 我正在
  • Powershell 没有一些内置帮助主题

    我发现我的 powershell 没有一些帮助主题 例如about profiles 我试过update help但这没有帮助 有谁可以帮忙看一下吗 PS C gt systeminfo Host Name OS Name Microsof
  • 命令提示符 con 的 Powershell 通讯员?

    例如 我想在屏幕上显示输出并将其复制到剪贴板 dir tee con clip 上面的方法不起作用 因为con在 PowerShell 的文件系统中不被识别为控制台 还可能存在以下场景 Get LongLongOutput tee con
  • for循环批处理文件内的算术

    我在批处理文件中有一个 for 循环 如下所示 for y in 100 200 300 400 500 do set a x y 25 echo x 该行 set a x y 25 好像没有做任何划分 将每个 y 除以 25 的正确语法是
  • 为所有用户持久安装 PowerShell 模块

    我正在通过以下方式安装 PowerShell 模块八达通部署 http octopusdeploy com 到许多不同的服务器上 出于测试目的 我按照 Microsoft 文档的指导进行了安装PowerShell模块 https learn
  • Windows下Kafka托管在Docker中删除主题时出现异常

    我在 Windows 的 Docker 中托管 Kafka 威斯迈斯特 卡夫卡 https hub docker com r wurstmeister kafka 使用 docker 镜像 Kafka 数据存储在本地 Windows 文件夹
  • 获取已创建进程的进程句柄 Windows

    我需要获取运行程序时刚刚创建的所有进程的句柄或 PID 到目前为止 我已经使用了这段代码 每次创建进程时都会告诉我 问题是我只获取有关创建的进程的信息 但没有有关进程本身的任何信息 https msdn microsoft com en u
  • 在 Windows 11 上无需管理员权限即可运行 Visual Studio 2022

    我在 Windows 11 上安装了 Visual Studio 2022 当我启动它时 它始终以管理员权限运行 我想在没有管理员权限的情况下运行它 我的 Windows 只有一个帐户 该帐户具有管理员权限 x 我做了什么 确认VS2022
  • Django 管理员 - 登录

    我正在建造一个Django Web App 与 Django Suit 用于管理界面 已经让 Python 2 7 Django 1 10 和 MySQL 和谐通信并启动了一个项目 python m django admin startpr
  • 使用脚本查找字符串长度的奇怪结果?

    我正在测试 unmeat 提交的这段代码这个问题 https stackoverflow com questions 21817684 batch get string length with special characters 肉叔叔引
  • 如何在 PowerShell 中键入 TAB 字符?

    Task 默认情况下 在 Windows 命令提示符中按 TAB 键将输出文件名 而在 PowerShell 中则不会执行任何操作 我希望能够在交互模式下键入 TAB 字符 而不是通过脚本 Research 我在这个网站上和通过谷歌搜索发现
  • 2 批字符串问题

    1 是否有任何内置函数可以告诉我变量的内容是否仅包含大写字母 2 有没有办法查看变量是否包含字符串 例如 我想查看变量 PATH 是否包含 Ruby 对于第 1 部分 findstr就是答案 您只需使用正则表达式功能即可errorlevel
  • 排除批复制脚本中的文件夹

    我正在使用 U 盘上的批处理文件来备份我的照片 我使用以下命令 for r C x in jpg png gif do copy y x 我想排除邮件文件夹 WINDOWS 和 PROGRAM FILES 中的文件 有谁知道如何使用批处理文
  • Python 可执行文件:py2exe 还是 PyInstaller?

    要创建可执行文件 Windows 我假设我们应该使用其中之一 Py2exe 或 PyInstaller 它们之间有什么区别 Py2exe 和 PyInstaller 都是包装器 但我注意到以下几点差异 Py2exe 与 python2 4
  • 使用 IDLE 编辑的 .py 文件消失了

    我曾经有过Edit with IDLE当我右键单击时的选项 py文件 但我多次卸载 重新安装以使某些东西正常工作 但现在它消失了 我检查了注册表HKEY CLASSES ROOT and HKEY LOCAL MACHINE对于价值低于Py
  • Windows7上python3.5无法安装BeautifulSoup4

    我已经从下载了 beautifulsoup4 4 5 3 tar gzhttps www crummy com software BeautifulSoup bs4 download 4 5 https www crummy com sof
  • 如何通过在原始文件名前添加序列号来重命名文件?

    伙计们 有谁知道我该怎么做 我试图通过在文件名的开头添加 1 2 3 等按数字顺序列出一些文件 同时保留文件的原始名称 这是我尝试过的代码 nr 1 Dir path C x y deneme Rename Item NewName 0 N
  • 如何在 C++ 中急于提交分配的内存?

    总体情况 带宽 CPU 使用率和 GPU 使用率都极其密集的应用程序需要每秒从一个 GPU 向另一个 GPU 传输约 10 15GB 的数据 它使用 DX11 API 来访问 GPU 因此上传到 GPU 只能在每次上传都需要映射的缓冲区中进
  • 确定用于映射网络驱动器的域和用户名

    使用带有 SP1 的 Windows 7 Enterprise 但我希望得到适用于 Windows XP 2003 2008 Vista 7 的通用答案 从命令提示符处 我执行net use命令将 Z 驱动器映射到另一台计算机上的共享 但我

随机推荐