C:\test我有一些以這種方式拆分的檔案
PARENT folder is C:\test
|
--- subfolder1
|
-- file1.part01.rar
-- file1.part02.rar
-- file2.part01.rar
-- file2.part02.rar
.....
--- subfolder2
|
-- file1.part1.rar
-- file1.part2.rar
-- file2.part1.rar
-- file2.part2.rar
......
我嘗試以這種方式提取這些檔案夾
PARENT folder is C:\test
|
--- subfolder1
|
-- file1 [folder]
-- file2 [folder]
.....
--- subfolder2
|
-- file1 [folder]
-- file2 [folder]
......
但我失敗了(批次似乎沒有開始)
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=2 delims=:" %%I in ('%SystemRoot%\System32\chcp.com') do set "CodePage=%%I"
%SystemRoot%\System32\chcp.com 65001 2>nul
set "PromptForBreak="
if /I "%~1" == "/noprompt" set "PromptForBreak=rem"
set "SourceFolder=C:\Test"
set "LogExtract=%SourceFolder%\ExtractionLog.txt"
set "LogError=%SourceFolder%\ErrorLog.txt"
del /Q "%LogExtract%" "%LogError%" 2>nul
for /F "eol=| delims=" %%I in ('dir "%SourceFolder%\*" /AD-H /B /ON 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /L /V /X /C:done') do (
set "NoFolderMove="
for /F "eol=| delims=" %%J in ('dir "%SourceFolder%\%%I\*.rar" "%SourceFolder%\%%I\*.zip" /A-D-H /B /ON 2^>nul') do (
if exist "%SourceFolder%\%%I\%%J" (
echo Extracting "%SourceFolder%\%%I\%%J" ...
"%ProgramFiles%\WinRAR\WinRAR.exe" x -cfg- -ibck -logpfu="%LogExtract%" -o -y -- "%SourceFolder%\%%I\%%J" "%SourceFolder%\%%I\"
if errorlevel 1 (
set "NoFolderMove=1"
set "ArchiveFile=%SourceFolder%\%%I\%%J"
>>"%LogError%" call echo Error %%ErrorLevel%% on extracting "%%ArchiveFile%%"
) else (
echo %%~nJ| %SystemRoot%\System32\findstr.exe /I /R "\.part[0123456789][0123456789]*$" >nul
if errorlevel 1 ( del /F "%SourceFolder%\%%I\%%J" ) else for %%# in ("%%~nJ") do del /F /Q "%SourceFolder%\%%I\%%~n#.part*%%~xJ"
)
)
)
if not defined NoFolderMove (
md "%SourceFolder%\done" 2>nul
if exist "%SourceFolder%\done\" move /Y "%SourceFolder%\%%I" "%SourceFolder%\done\" >nul
%PromptForBreak% %SystemRoot%\System32\choice.exe /C NY /N /T 2 /D N /M "Break execution [N/Y]? "
%PromptForBreak% if errorlevel 2 goto EndBatch
)
)
:EndBatch
if defined CodePage %SystemRoot%\System32\chcp.com %CodePage%
endlocal
uj5u.com熱心網友回復:
問題中的批處理檔案代碼運行沒有任何錯誤。使用自己創建的四個多卷RAR壓縮包并沒有生成想要的目錄樹,但是在批處理檔案執行程序中沒有錯誤輸出。
以下批處理檔案可用于此任務,分別使用WinRARRar.exe版本 5.70 或支持開關的更新版本-ad1(必需)和-isnd-(非必需):
@echo off
setlocal EnableExtensions DisableDelayedExpansion
"%ProgramFiles%\WinRAR\Rar.exe" x -ad1 -cfg- -c- -idq -isnd- -o -r -y -- "C:\Test\*.rar"
if errorlevel 1 pause & exit /B
for /F "delims=" %%I in ('dir "C:\Test\*.part*" /AD /B /S 2^>nul') do (
if exist "%%I\%%~nI\" (
dir "%%I" /A /B | %SystemRoot%\System32\findstr.exe /I /L /V /X /C:"%%~nI" | %SystemRoot%\System32\findstr.exe /R "^." >nul
if errorlevel 1 (
move "%%I\%%~nI" "%%~dpI" >nul
if not errorlevel 1 (rd "%%I") else ren "%%I" "%%~nI"
) else ren "%%I" "%%~nI"
) else ren "%%I" "%%~nI"
)
del /A-R /Q /S "C:\Test\*.rar" >nul
endlocal
RAR命令x和RAR開關在WinRAR控制臺版本的手冊中都有描述,該手冊是WinRARRar.txt程式檔案目錄中的文本檔案。該手冊的底部還包含可能的退出值及其含義。
也可以使用UnRAR.exe5.70 或更新版本來提取 RAR 檔案,這是免費軟體,Rar.exe而共享軟體是免費軟體。UnRAR.exe(UnRAR for Windows) 可以從WinRAR 和 RAR 存檔插件下載。
Rar.exe批處理檔案在提取通過命令PAUSE遞回找到的所有存檔期間出現任何錯誤時執行,以停止批處理檔案執行以查看錯誤訊息,然后退出批處理檔案處理而不執行清理步驟。
提取完成后,該目錄C:\Test可能包含以下檔案夾和檔案:
- 子檔案夾1
- 檔案 1.part01
- 一個或多個提取的檔案夾
- 一個或多個提取的檔案
- 檔案 2.part1
- 檔案2
- 一個或多個提取的檔案夾
- 一個或多個提取的檔案
- 檔案2
- file1.part01.rar
- file1.part02.rar
- 檔案2.part1.rar
- 檔案2.part2.rar
- 檔案 1.part01
- 子檔案夾2
- 檔案 3.part01
- 一個或多個提取的檔案夾
- 一個或多個提取的檔案
- 檔案 4.part1
- 檔案4
- 一個或多個提取的檔案夾
- 一個或多個提取的檔案
- 一個或多個額外提取的檔案夾
- 一個或多個額外的提取檔案
- 檔案4
- 檔案3.part01.rar
- 檔案3.part02.rar
- 檔案4.part1.rar
- 檔案4.part2.rar
- 檔案 3.part01
.part01不需要以or結尾的目錄名稱.part1。因此,名稱與通配符模式匹配的目錄*.part*通過洗掉 "extension" 來重命名.part*。
也可能存在多卷 RAR 存檔,其中僅包含一個與包含所有存檔目錄和檔案的 RAR 存檔檔案同名的目錄。在上面的示例中就是這種情況,用于file2.part?包含file2具有所有存檔目錄和檔案的目錄。對于這樣的檔案,最好在多卷 RAR 檔案檔案的目錄中擁有 finallyfile2而不是 finally 。file2\file2由于這個原因,file2.part1\file2被移動到subfolder1帶有名稱file2的目錄,并且現在的空目錄file2.part1被批處理代碼洗掉。
存檔也可能包含與存檔檔案同名的目錄,但也可能包含其他目錄和檔案,例如file4.part?. 在這種情況下,不應進行目錄移動,因為結果與存檔中的結果不同。
最后,批處理檔案洗掉所有 RAR 存檔檔案,但由于使用選項而設定了只讀屬性的檔案除外/A-R。這使得可以在具有只讀屬性集的所有 *.rar 檔案的同一目錄結構上多次運行批處理檔案,并且Rar.exe在每次執行批處理檔案之間洗掉由創建的目錄。
最后但一個命令列也可以是:
del /A /F /Q /S "C:\Test\*.rar" >nul
該命令列將洗掉所有 RAR 存檔檔案C:\Test及其所有子目錄。
這個批處理檔案的最終結果C:\Test是:
- 子檔案夾1
- 檔案 1
- 一個或多個提取的檔案夾
- 一個或多個提取的檔案
- 檔案2
- 一個或多個提取的檔案夾
- 一個或多個提取的檔案
- 檔案 1
- 子檔案夾2
- 檔案 3
- 一個或多個提取的檔案夾
- 一個或多個提取的檔案
- 檔案4
- 檔案4
- 一個或多個提取的檔案夾
- 一個或多個提取的檔案
- 一個或多個額外提取的檔案夾
- 一個或多個額外的提取檔案
- 檔案4
- 檔案 3
要了解使用的命令及其作業原理,請打開命令提示符視窗,在其中執行以下命令,并仔細閱讀每個命令顯示的所有幫助頁面。
del /?dir /?echo /?endlocal /?exit /?findstr /?for /?if /?move /?pause /?rd /?ren /?setlocal /?
閱讀有關使用命令重定向運算子的Microsoft 檔案,了解2>nul. 當 Windows 命令解釋器在執行命令FOR之前在后臺啟動的單獨命令列程中執行嵌入式命令列時,重定向運算子>必須^在FOR命令列上使用脫字符進行轉義,以將其解釋為文字字符。dir
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/485733.html
標籤:批处理文件
