0

作成したバッチ ファイルのいくつかのレジストリ キーを削除しようとしています。

ここで次のコードを見つけましたが、REG DELETE に到達するまで問題なく動作します。

for /F "tokens=1,*" %%a in ('REG QUERY "%KEY%" ^| findstr /I /C:"%VALUE%"') do (REG DELETE %KEY% /v %%a)

値は [HK_CLASSES_ROOT\Installer\Assemblies\Global] の下にあり
ます。おそらくご覧のとおり、ここにあるほとんどの値には引用符が含まれています。次に例を示します。

ADODB,fileVersion="7.10.2346.0",version="7.0.3300.00",culture="neutral",publicKeyToken="B03F5F7F11D50A3A"

それはまさに私が削除したいものではありませんが、かなり近いものです。

したがって、 %%a をエコーすると、引用符とすべてを含むregeditにある値の名前が表示されます。しかし、REG DELETE を通過するとすぐに (現在は確認を求められます) 引用符が存在しないため、[はい] をクリックすると、キーが見つからないことがわかります。

最初に見つけたものと同じものを解析しなかったため、明らかにできません。私は解決策を見つけようとしてきましたが、これまで正しい方向に役立つものは何も見つかりませんでした。おそらくvbsでも同じことができることはわかっていますが、これは1行の長さですが、vbsでは同じ仕事をするのにもっと時間がかかります。

さらに情報が必要な場合は、質問してください。バッチファイルをいじり始めました。これを作成したのは、学校で仕事をするたびに、学校のプロジェクトのすべての依存関係のインストール プロセスを自動化する必要があったためです (コンピューターはゴースト化されています)。

ありがとう

4

1 に答える 1

3

注-"tokens=1,*"最初のトークンのみを使用しているため、は必要ありません。しかし、それも問題を引き起こしていません

コメントで発見して述べたように、引用符はとしてエスケープする必要があります\"。環境変数の検索と置換を使用して、プログラムで引用符をエスケープできます。コードブロック内で変数を設定および展開する必要があるため、遅延展開を使用する必要があります。これは、行が解析されるときに通常の展開が発生し、ブロック全体が一度に解析されるため、通常の展開では、ループが実行される前に存在していた値が生成されるためです。回線が実行されると、拡張の遅延が発生します。

@echo off
setlocal enableDelayedExpansion

::some additional code to setup KEY and VALUE

for /F %%A in ('REG QUERY "%KEY%" ^| findstr /I /C:"%VALUE%"') do (
  set val=%%A
  REG DELETE "%KEY%" /v !val:"=\"!
)

値を含めることができるかどうかはわかりませんが、可能である!場合は、ループ内で遅延拡張のオンとオフを切り替える必要があります。そうしないと、%% Aの展開は、が含まれていると破損します!

@echo off
setlocal disableDelayedExpansion

::some additional code to setup KEY and VALUE

for /F %%A in ('REG QUERY "%KEY%" ^| findstr /I /C:"%VALUE%"') do (
  set val=%%A
  setlocal enableDelayedExpansion
  REG DELETE "%KEY%" /v !val:"=\"!
  endlocal
)
于 2012-10-24T02:05:45.767 に答える