对于批处理文件中的循环变量:意外结果

时间:2013-09-13 15:42:12

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

我试图通过从注册表中提取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,基于{{1}的结果就在它之前。

任何帮助将不胜感激!

更新

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

无论如何,我能够使用另一个FOR循环来拆分字符串,并将程序FOR从传递的参数中分离出来。

我不认为这是一个理想的解决方案,因为它只是因为这个特定的 UninstallString 的格式化方式才有效,但是它有效。

这是更新后的代码:

START

2 个答案:

答案 0 :(得分:0)

试试这个:

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

答案 1 :(得分:0)

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

由于