REG QUERY、REG EXPORT、リストのマッチング、一致した場合は REG DELETE、CMD と output.log への出力を ECHO するバッチ FOR LOOP

REG QUERY、REG EXPORT、リストのマッチング、一致した場合は REG DELETE、CMD と output.log への出力を ECHO するバッチ FOR LOOP

削除したいレジストリ キー/値/エントリのリストがあります (基本的には、以下の #3 のリストから REG DELETE を除いたもの)。そのままでも動作しますが、バッチ処理を行いたいのですが...

I. %~dp0 に list.txt が存在しない場合は、listfile.txt 自体を書き込む

:

set "ListFile=%TEMP%\ListFile.txt"
set "List=%~dp0list.txt"

if not exist "%List%" (
    (
        echo Some regisrtry key
        echo Some registry value
        echo Some registry subkey
        echo No idea how it should all be written like
    ) >"%ListFile%"
)

II. REG QUERYでリスト内の各項目の存在を確認し、ERRORLEVELを確認します。

もし存在するなら…

  1. REG を独自の有効な .reg にエクスポートします (問題が発生した場合に再度インポートできます)。

:

for /f %%A in (%src%) do (
    if not exist "%bkp%\%%A" md "%bkp%\%%A"
    reg export "%%A" "%bkp%\%%A\key.reg"

上記が特定の値で機能するか、指定されたキー内のすべてのエントリで機能するかはわかりません。

  1. リストと.regを比較する

  2. 一致する場合は、必要に応じて REG DELETE /f または REG DELETE /v /f または REG DELETE /va /f を実行します。

REG DELETE "HKCU\Software\Google\Chrome" /f
REG DELETE "HKLM\Software\Google\Chrome" /f
REG DELETE "HKCU\Software\Policies\Google\Chrome" /f
REG DELETE "HKLM\Software\Policies\Google\Chrome" /f
REG DELETE "HKLM\Software\Policies\Google\Update" /f
REG DELETE "HKLM\Software\WOW6432Node\Google\Enrollment" /f
REG DELETE "HKLM\Software\WOW6432Node\Google\Update\ClientState\{430FD4D0-B729-4F61-AA34-91526481799D}" /v CloudManagementEnrollmentToken /f
REG DELETE "HKLM\Software\WOW6432Node\Microsoft\Policies" /f
REG DELETE "HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Policies" /f
REG DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies" /f
REG DELETE "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies" /f
REG DELETE "HKCU\Software\Microsoft\WindowsSelfHost" /f
REG DELETE "HKLM\Software\Microsoft\WindowsSelfHost" /f
REG DELETE "HKLM\Software\Microsoft\Policies" /f
REG DELETE "HKCU\Software\Policies" /f
REG DELETE "HKLM\Software\Policies" /f
REG DELETE "HKLM\Software\Policies\Microsoft\Windows Defender" /v DisableAntiSpyware /f
REG DELETE "HKLM\Software\Policies\Microsoft\Edge" /va /f
REG DELETE "HKLM\Software\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate" /f
REG DELETE "HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate" /f
  1. キー/値/エントリが処理され削除されたことを cmd と %~dp0output.log に ECHO します

存在しない場合は..

  1. cmd に ECHO し、%~dp0output.log に存在しないことを報告します
"HKCU\Software\Google\Chrome" key does not exist
No entries can be found in "HKLM\Software\Policies\Microsoft\Edge"
Value DisableAntiSpyware cannot be found in "HKLM\Software\Policies\Microsoft\Windows Defender"

III. バッチによって作成されたリストを削除しますが、既に存在する場合は削除しません。

IF EXIST "%ListFile%" ( DEL "%ListFile%" ) ELSE ( goto :eof )

見つけたスニペットを変更しようとしましたが、for ループがどのように機能するのかまだ理解していません。また、リストが 1 つだけになり、for ループがキー、値 (/v)、および/または指定されたキー (/va) 内のすべてのエントリの処理のみを必要とする場合に適応する方法も理解していません。

以下の現在のスクリプトは今のところは動作しますが、上記のすべてのポイントが欠けています。これらを追加するためのご協力をいただければ幸いです。

REG DELETE "HKCU\Software\Google\Chrome" /f
REG DELETE "HKLM\Software\Google\Chrome" /f
REG DELETE "HKCU\Software\Policies\Google\Chrome" /f
REG DELETE "HKLM\Software\Policies\Google\Chrome" /f
REG DELETE "HKLM\Software\Policies\Google\Update" /f
REG DELETE "HKLM\Software\WOW6432Node\Google\Enrollment" /f
REG DELETE "HKLM\Software\WOW6432Node\Google\Update\ClientState\{430FD4D0-B729-4F61-AA34-91526481799D}" /v CloudManagementEnrollmentToken /f
REG DELETE "HKLM\Software\WOW6432Node\Microsoft\Policies" /f
REG DELETE "HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Policies" /f
REG DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies" /f
REG DELETE "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies" /f
REG DELETE "HKCU\Software\Microsoft\WindowsSelfHost" /f
REG DELETE "HKLM\Software\Microsoft\WindowsSelfHost" /f
REG DELETE "HKLM\Software\Microsoft\Policies" /f
REG DELETE "HKCU\Software\Policies" /f
REG DELETE "HKLM\Software\Policies" /f
REG DELETE "HKLM\Software\Policies\Microsoft\Windows Defender" /v DisableAntiSpyware /f
REG DELETE "HKLM\Software\Policies\Microsoft\Edge" /va /f
REG DELETE "HKLM\Software\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate" /f
REG DELETE "HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate" /f

@RD /S /Q "%ProgramFiles(x86)%\Google\Policies"
@RD /S /Q "%WinDir%\System32\GroupPolicy"
@RD /S /Q "%WinDir%\System32\GroupPolicyUsers"

ECHO.
gpupdate /force
ECHO.
ECHO Complete. Will shutdown..
pause>nul
shutdown.exe /r /t 00
EXIT /B 0

答え1

@echo off

for /f usebackq^tokens^=1-3*delims^=^" %%i in =;(
    `type "%~f0" ^| findstr /b \^"`
        );= do if "%%~l" == "" 2>nul =;(
             reg query "%%~i" >nul && =;(
             reg export "%%~i" "%%~k.reg" /y
             reg delete "%%~i" /f
            );= || echo/Key not exist "%%~i"
        );= else if "%%~l" == "/va" 2>nul =;(
             reg query "%%~i" >nul && =;(
             reg export "%%~i" "%%~k.reg" /y
             reg delete "%%~i" /va /f
            );= || echo/Key not exist "%%~i"
        );= else 2>nul =;(
             reg query "%%~i" >nul && =;(
             reg export "%%~i" "%%~l.reg" /y
             reg delete "%%~i" /v "%%~j" /f
            );= || echo/Key not exist "%%~i"
        );=

>nul 2>&1 rd /s /q "%ProgramFiles(x86)%\Google\Policies" "%Windir%\System32\GroupPolicy" "%Windir%\System32\GroupPolicyUsers"

echo/ & gpupdate /force | findstr . 
timeout -1 | echo/Complete. Will shutdown!.. 

echo/ & shutdown.exe /r /t 00   
exit /b 0 || goto :eof

::--------------------------------------------------------------::
::         Your listing of registry keys/values/entries         ::
::--------------------------------------------------------------::

"HKCU\Software\Policies" "HKCU_Policies"
"HKCU\Software\Google\Chrome" "HKCU_Chrome"
"HKCU\Software\Policies\Google\Chrome" "HKCU_Google_Chrome"
"HKCU\Software\Microsoft\WindowsSelfHost" "HKCU_Microsoft_WindowsSelfHost"
"HKCU\Software\Microsoft\Windows\CurrentVersion\Policies" "HKCU_Microsoft_Policies"

"HKLM\Software\Policies" "HKLM_Policies"
"HKLM\Software\Google\Chrome" "HKLM_Chrome"
"HKLM\Software\Microsoft\Policies" "HKLM_Microsoft_Policies"
"HKLM\Software\Policies\Google\Chrome" "HKLM_Google_Chrome"
"HKLM\Software\Policies\Google\Update" "HKLM_Google_Update"
"HKLM\Software\Microsoft\WindowsSelfHost" "HKLM_Microsoft_WindowsSelfHost"
"HKLM\Software\Policies\Microsoft\Edge" "HKLM_Edge" /va

"HKLM\Software\Microsoft\Windows\CurrentVersion\Policies" "HKLM_CurrentVersion_Policies"
"HKLM\Software\Policies\Microsoft\Windows Defender" "HKLM_Windows_Defender" "DisableAntiSpyware"
"HKLM\Software\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate" "HKLM_WindowsStore_WindowsUpdate"

"HKLM\Software\WOW6432Node\Google\Enrollment" "HKLM_WOW6432Node_Google_Enrollment"
"HKLM\Software\WOW6432Node\Microsoft\Policies" "HKLM_WOW6432Node_Microsoft_Policies"
"HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Policies" "HKLM_WOW6432Node_CurrentVersion_Policies"
"HKLM\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate" "HKLM_WOW6432Node_WindowsStore_WindowsUpdate"
"HKLM\Software\WOW6432Node\Google\Update\ClientState\{430FD4D0-B729-4F61-AA34-91526481799D}" "HKLM_WOW6432Node_Google_Update_ClientState" "CloudManagementEnrollmentToken"

1.バッチストアを使用して、キーと名前(一意)をfiles.regにリストします。

2.ループを使用してFor /Fキーを検索/フィルタリングする

3.For /Fこのループでは区切り文字として「引用符」を使用するよう選択します

4.ループコマンドでは、次の行で始まる行を除外します。"(引用) と:

  • for ...('
             type "%~f0" ^|findstr /b \^" 
                                          ')do...
    

5.%%l内の値(null、等しい、または異なる)の出現を使用してif各ケースを処理します。

6.&&成功演算子を使用すると、reg queryレジストリにキー/値が存在するかどうかがわかります。

6.&&成功演算子を使用すると、reg queryレジストリにキー/値が存在するかどうかがわかります。


観察1:1 つのコマンドで複数のフォルダーを削除できます。

   rd /q /s "FOLDER_01" "FOLDER_02" "FOLDER_nn"
rmdir /q /s "FOLDER_01" "FOLDER_02" "FOLDER_nn"

観察2:存在しないフォルダを削除すると、核宇宙エラーは返されず、警告のみが返されます。「システムが見つけられません」したがって、フォルダーが存在するかどうかに関係なく、フォルダーを削除するときに単純なテキスト メッセージを省略するだけで、bat の実行が中止されることもありません。

2>nul rmdir /q /s "FOLDER_01" "FOLDER_02" "FOLDER_nn"
if exist "FOLDER_01" rd /q /s "FOLDER_01"
if exist "FOLDER_02" rd /q /s "FOLDER_02"
if exist "FOLDER_nn" rd /q /s "FOLDER_nn"

観察3:削除コマンドにも同じことが当てはまります。

2>nul del /q "FILE_01" "FILE_02" "FILE_nn"
if exist "FILE_01" del /q "FILE_01"
if exist "FILE_02" del /q "FILE_02"
if exist "FILE_nn" del /q "FILE_nn"

追加リソース:

関連情報