0

バッチ ファイルを使用して、レジストリから 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」が見つからないというエラーが表示されます。これは、そのEcho直前の結果に基づいて、UninstallString 全体が思ったように使用されていないことを示しています。

どんな助けでも大歓迎です!

アップデート:

動作しました。何らかの理由で、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
               )
            )
        )
    )
)
4

2 に答える 2

0

同じ問題が発生しており、環境変数の括弧に関連しているようです。すなわち C:\Program Files* ( x86 ) *. もっとエレガントなソリューションがあればいいのにと思いますが、私たちのソリューションはあなたのものと非常に似ています.

ありがとう

于 2014-03-04T22:12:11.337 に答える
0

これを試して:

 start /wait "" "%%~C" "%%~D"
于 2013-09-13T18:03:31.150 に答える