[英]Extract 7-zip files into their containing directory from a batch file?
我有一個目錄c:\7zip\test
,其中包含許多子目錄,其中一些包含 7-zip 文件。
我想從批處理文件中找到 7-zip 文件並將其提取到它們的保存目錄中,然后刪除這些 7-zip 文件。
@If "%1"=="" (Set pathf=c:\7zip\test\) else (Set pathf=%1)
@If "%2"=="" (Set lzma2_test=*.7z) else (Set lzma2_test=%2)
for /r "%pathf%" %%f in ("%lzma2_test%") do 7z x -y -mx1 -m0=lzma2 "%%f" -oFolderName
del "%pathf%" + subfolder name (if needed) + 7-zip file name
而不是FolderName
,我應該發送一個目錄名稱,但我不知道如何。 對於del
也是如此。
打開命令提示符,運行for /?
並閱讀從第一頁頂部到最后一頁底部的輸出幫助,尤其是關於使用%~dpI
類的修飾符引用循環變量的部分,其中I
是引用驅動器和路徑的循環變量。
@echo off
if "%~1" == "" (set "pathf=c:\7zip\test") else (set "pathf=%~1")
if "%~2" == "" (set "lzma2_test=*.7z") else (set "lzma2_test=%~2")
for /R "%pathf%" %%I in ("%lzma2_test%") do (
7z.exe x -y -o"%%~dpI" "%%I"
if not errorlevel 1 del "%%I"
)
壓縮開關-mx1 -m0=lzma2
在提取檔案時沒有用。 存檔在標題中包含用於壓縮的算法,因此只要使用的7z.exe
支持存檔類型和創建存檔時使用的算法,提取總是有效的。
僅當提取成功時才會刪除存檔文件,即7x.exe
退出時的值不大於或等於1
,這意味着等於0
,即成功提取的退出代碼。
如果存檔文件包含在另一個存檔文件中,則使用以下代碼會更安全。 此代碼也推薦用於 FAT16、FAT32 或 exFAT 驅動器。
@echo off
if "%~1" == "" (set "pathf=c:\7zip\test") else (set "pathf=%~1")
if "%~2" == "" (set "lzma2_test=*.7z") else (set "lzma2_test=%~2")
for /F "eol=| delims=" %%I in ('dir "%pathf%\%lzma2_test%" /A-D /B /S 2^>nul') do (
7z.exe x -y -o"%%~dpI" "%%I"
if not errorlevel 1 del "%%I"
)
此代碼確保不會偶然在存檔文件中提取存檔文件,因為它可能發生在第一個代碼迭代存檔文件列表的第一個代碼中,在提取包含存檔文件的存檔文件時,列表在每次迭代時發生變化,並且因為刪除成功提取的檔案。
最好先在命令提示符窗口中運行它來測試使用的批處理文件,並將echo
顯留給7z.exe
, if not errorlevel 1
,則查看在沒有真正執行它的情況下會執行什么。
要了解使用的命令及其工作原理,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀每個命令顯示的所有幫助頁面。
call /?
del /?
dir /?
echo /?
for /?
if /?
set /?
閱讀有關使用命令重定向運算符的 Microsoft 文章,了解2>nul
的說明。 重定向運算符>
必須在FOR命令行上使用脫字符^
進行轉義,以便在 Windows 命令解釋器在執行命令FOR之前處理此命令行時解釋為文字字符,FOR 使用在后台啟動的單獨命令進程執行嵌入式dir
命令行%ComSpec% /c
和'
之間的命令行作為附加參數附加。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.