簡體   English   中英

從批處理文件中提取 7-zip 文件到它們的包含目錄中?

[英]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.exeif 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM