【问题标题】:How to run *.exe /key from the .bat in loop如何在循环中从 .bat 运行 *.exe /key
【发布时间】:2026-02-01 16:45:02
【问题描述】:

我有目录结构:

DIR
|-UNINSTALL.BAT
|-component_name
  |-source
  |-setup.exe
  |-uninst.bat
|-another_component_name
  |-source
  |-setup.exe
  |-uninst.bat
|-yet_another_component_name
  |-source
  |-setup.exe
  |-uninst.bat

等等……

在像“component_name”这样的每个目录中,我都有setup.exe 文件,它将当前组件安装到Delphi 中的调色板组件中。 uninst.bat 只包含这个字符串:

"setup.exe" /uninstall

所以我需要在DIR 中写入UNINSTALL_ALL.bat,这将在所有组件目录中运行 uninst.bat。

提前谢谢你。

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    这在批处理文件中有点尴尬。尽管您可能可以使用 foreach 语句来做到这一点。不过我建议你看看 Powershell,如果你想要的话,它肯定会让你有能力简单地做到这一点。

    【讨论】:

    • Powershell 的一个潜在问题是它可能没有安装在大多数机器上,而您始终可以运行批处理文件。 OTOH,在尝试做复杂的事情时,批处理文件非常糟糕,所以虽然这个特殊的事情可以不用大惊小怪地完成,但我可以很容易地想象遇到你希望使用真实语言的情况。
    • 是的。但 powershell 是作为 windows 7、windows 2008 服务器的一部分提供的,并且可以通过 windows 更新为大多数其他版本的 windows 提供,并且受 Microsoft 产品支持的支持。因此因此在受控发布环境中安装应该是可能的。我认为安装它的好处超过了安装它的障碍。
    【解决方案2】:

    你可以用这条线来做:

     for /f %%a in ('dir /b /s uninst.bat') do call %%a
    

    请注意,'%%' 对于批处理文件是必需的。如果你在命令行上测试这个,只使用一个'%'

    【讨论】:

    • 那行不通。一个 .bat 运行另一个 .bat,它运行带有密钥的 .exe 文件……也许根本不可能?
    • 应该可以。您在控制台上看到什么样的错误?您是否独立测试了 uninst.bat?
    【解决方案3】:

    您想使用“for”构造。像这样的:

    for %%i in (component_name another_component_name yet_another_component_name) do %%i\uninst.bat
    

    如果您将“for”循环放在批处理文件中,则需要双重转义 (%%)。如果您只是在命令提示符下输入,请仅使用 1 %。

    此外,如果目录名称遵循某种约定,您也可以使用通配符来匹配目录名称。打开命令提示符并运行“for /?”查看它可以做的一切......我相信有一个 /d 选项可以匹配目录。这看起来像:

    for /D %%d in (component_*) do %%d\uninst.bat
    

    (显然,调整通配符以匹配您的组件目录。)

    【讨论】:

      【解决方案4】:

      这应该可行:

      FOR /F %%a IN ('dir /b /s uninst.bat') DO START /B %%a
      

      如果你想让他们互相等待,使用这个:

      FOR /F %%a IN ('dir /b /s uninst.bat') DO START /B /WAIT %%a
      

      【讨论】:

        【解决方案5】:

        按照您描述问题的方式,您只有一层子目录,并且您总是从根目录调用同一个批次。因此:

        Uninstall_all.cmd

        @echo off
        for /F "delims=" %%d in ('dir /b /ad') do cd "%%d"& start /b /w ..\uninstall.bat& cd ..
        

        应该做的伎俩。

        【讨论】: