The Script:
for /F %%I IN ('dir /b /s *.zip *.rar') DO (
"C:\Program Files\7-Zip\7z.exe" x -o"%%~dpI" "%%I"
)
Explanation:
for /F %%I IN ('dir /b /s *.zip *.rar') DO (
This performs a loop for each file returned by the command dir /b /s *.zip *.rar. The /s tells dir to recurse into subdirectories and /b prints in bare format.
The filename is stored in the %%I variable for use later. If you were typing this at the prompt, you would use %I instead.
"C:\Program Files\7-Zip\7z.exe" x -o"%%~dpI" "%%I"
This performs the extraction. The argument -o"%%~dpI" extracts the file into the same directory where the archive resides. Other options:
-o"%%~dpI" — Extracts into the directory where the archive resides.
-o"%%~dpnI" — Creates a new directory in the hierarchy named after the archive and extracts there (that is, AFolder\archive.zip extracts into AFolder\archive\).
-o"%%~nI" — Creates a new directory in the current directory named after the archive and extracts there (that is, AFolder\archive.zip extracts into .\archive\).
Omit the -o argument — Extracts into the current directory.
Example:
C:\Temp>tree /F
Folder PATH listing
Volume serial number is 08A4-22E0
C:.
│ batch.bat
│
├───AFolder
│ a.zip
│
├───BFolder
│ b.zip
│
└───CFolder
c.zip
C:\Temp>batch.bat > nul
C:\Temp>tree /F
Folder PATH listing
Volume serial number is 08A4-22E0
C:.
│ batch.bat
│
├───AFolder
│ a.zip
│ a.zip.txt
│
├───BFolder
│ b.zip
│ b.zip.txt
│
└───CFolder
c.zip
c.zip.txt