【问题标题】:For Loop Variables In Batch Files: Unexpected Results批处理文件中的循环变量:意外结果
【发布时间】:2013-09-13 15:42:12
【问题描述】:

我正在尝试使用批处理文件通过从注册表中提取 UninstallString 来卸载某个程序的任何实例。我以前在这方面取得了成功,但不确定我在这里缺少什么。

这是有问题的代码:

REM Loop thru Uninstall keys
ECHO Checking installed programs list for myAPP.
FOR /F "tokens=*" %%A IN ('reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall') DO (
    REM For each uninstall key, look for the DisplayName to match our application.
    FOR /F "tokens=3" %%B IN ('reg query "%%A" /v DisplayName') DO (
        REM If it's our application, uninstall it.
        IF "%%B" == "myAPP" (
            ECHO Found %%B at %%A
            FOR /F "tokens=3*" %%C IN ('reg query "%%A" /v UninstallString') DO (
                ECHO Uninstalling instance.
                ECHO %%C %%D
                start /wait %%C %%D
            )
        )
    )
)

ECHO %%C %%D 语句按预期工作,但 start /wait %%C %%D 行没有。

start之前的输出:

Checking installed programs list for myAPP
Found myAPP at HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\1139844978.www.myDOMAIN.local
Uninstalling instance.
c:\Program Files (x86)\Microsoft Silverlight\5.1.20125.0\Silverlight.Configuration.exe -uninstallApp 1139844978.www.myDOMAIN.local

但是 start 命令给了我一个错误,说找不到“C:\Program”,这告诉我它没有像我想象的那样使用整个 UninstallString,基于它之前的 Echo 的结果.

任何帮助将不胜感激!

更新:

搞定了。出于某种原因,FOR 循环在 C:\Program 和字符串的其余部分之间拆分,我不明白,因为该路径的其余部分还有其他空格。

无论如何,我能够使用另一个FOR 循环来拆分字符串并将START 正在调用的程序与传递的参数分开。

我不认为这是一个理想的解决方案,因为它只是因为这个特殊的 UninstallString 的格式化方式而起作用,但它确实有效。

这是更新后的代码:

:isInstalled
REM Loop thru Uninstall keys
ECHO Checking if already installed.
FOR /F "tokens=*" %%A IN ('reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall') DO (
    REM For each uninstall key, look for the DisplayName to match our application.
    FOR /F "tokens=3" %%B IN ('reg query "%%A" /v DisplayName') DO (
        REM If it's our application, uninstall it.
        IF "%%B" == "myAPP" (
            ECHO Found %%B at %%A
            FOR /F "tokens=3*" %%C IN ('reg query "%%A" /v UninstallString') DO (
               ECHO Uninstalling instance.
               FOR /F "tokens=1,2 delims=-" %%E IN ('ECHO %%~C %%~D') DO (         
                   START /wait "" "%%E" -%%F
               )
            )
        )
    )
)

【问题讨论】:

  • 这会跳来跳去,一边挥舞着一面旗帜,一边对我大喊“在你的参数周围加上引号”......

标签: variables for-loop batch-file registry uninstallation


【解决方案1】:

试试这个:

 start /wait "" "%%~C" "%%~D"

【讨论】:

  • 我试过了,还有start /wait "" "%%C %%D" 现在抛出一个错误:Windows cannot find 'c:\Program Files (x86)\Microsoft Silverlight\5.1.201.25.0\Silverlight.Configuration.exe -uninstallApp 1139844978.www.myDOMAIN.local'. Make sure you typed the name correctly, and then try again.
  • 附带说明,我确实验证了此文件是否存在。 start.exe 解释事物的方式一定很愚蠢,好像整个字符串都是文件,而不是区分参数。我想我可能需要在另一个 FOR 循环中分隔和分隔参数以使其正常工作。我希望我可以说,“在 UninstallString 中看到该值?运行它。”
  • 你可以试试这个:start /wait "" "%%~C" %%D%%D 周围没有双引号。
【解决方案2】:

我们遇到了同样的问题,它似乎与环境变量中的括号有关。即 C:\Program Files*(x86)*。我希望我有一个更优雅的解决方案,但我们的解决方案与您的非常相似。

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多