因此,我希望能夠將一個或多個 rar 或 zip 檔案拖到批處理 .cmd 腳本中,該腳本將帶有 7zip 的檔案提取到上一級目錄,將提取的檔案重命名為當前檔案夾名稱,然后洗掉帶有rar 或 zip 檔案。
到目前為止,我有:
set work=%temp%\%random%%random%%random%%random%
mkdir "%work%" || goto :eof
for %%A in (*.zip *.rar) do (
"%ProgramFiles%\7-Zip\7z.exe" e -o"%work%" "%%~A"
for %%F in ("%work%\*") do move "%%~F" "%%~nA%%~xF"
)
rmdir "%work%"
這會將檔案提取到當前目錄并將其重命名為存檔名稱,但我想將其命名為存檔所在的目錄,因此需要更改 %%~nA 但鍵入“for /?” 似乎沒有給我一個獲取當前目錄的選項。然后我需要將提取的檔案向上移動一級并洗掉包含存檔檔案的檔案夾,我只是不知道在回圈中使用 move 和 rmdir 時如何參考檔案。
這是我第一次嘗試批處理腳本,請放輕松。
uj5u.com熱心網友回復:
這將更多地成為關于如何在 *cough* 一種糟糕的 *cough* 批處理編程語言中進行相當好的編程的一課。
第一個階段是由外向內,或自上而下作業。構建這個框架只用了幾分鐘。子目標/步驟是:
- 只需遍歷所有引數,看看我們是否可以將它們保存到變數中,然后將它們回顯。
- 弄清楚如何提取 SubFolderName(稍后將是檔案名),并在每個回圈中回顯它。
- 構建 Extract 檔案夾并在每個回圈中回顯。
- 意識到您忘記了您將需要呼叫批處理檔案的檔案夾路徑,將其添加為第一個引數,并在輸入 :ltpLoop 之前將其解壓縮。
%1 獲取第一個引數,而 SHIFT 將移動所有引數,以便 %1=%2、%2=%3、%3=%4、%4=%5 等...這有效地洗掉了第一個引數并將引數總數減少 1。當 SHIFT 洗掉所有引數并且 %1 不再具有值時,IF 陳述句退出腳本。
另外,很多人會在 ECHO 命令后面加上句號(ECHO.Text 來回顯),但我有一個不好的情況,句號列印了一個空行而不是文本,而是分號;很好 - 所以我不做期間,期間!
@ECHO OFF
GOTO :Start
:LoopThroughParameters
SET CmdPath=%~1
SHIFT
ECHO;[[[%CmdPath%]]]
:ltpLoop
IF [%1] EQU [] GOTO :EOF
SET Folder=%~1
SET SubFolderName=%~nx1
SET ExtractFolder=%~1\Extract
ECHO;
ECHO;[%Folder%]
ECHO;[%SubFolderName%]
ECHO;[%ExtractFolder%]
SHIFT
GOTO :ltpLoop
:Start
CALL :LoopThroughParameters "%~dp0" %*
PAUSE
在第 2 階段,我們首先通過洗掉不需要的回聲來清理代碼。
:LoopThroughParameters
SET CmdPath=%~1
SHIFT
:ltpLoop
IF [%1] EQU [] GOTO :EOF
SET Folder=%~1
SET SubFolderName=%~nx1
SET ExtractFolder=%~1\Extract
<<New Code Will Go Here>>
SHIFT
GOTO :ltpLoop
在 <<New Code Will Go Here>> 區域開始試驗。
ECHO;FOR %%C IN ("%Folder%\*.zip" "%Folder%\*.rar") DO (
代碼通過創建 5 個檔案夾進行測驗,每個檔案夾中有一個 zip 檔案,然后將檔案夾拖到批處理檔案中,看看我們是否喜歡它構建的命令。
FOR %C IN ("D:\Temp\StackOverflow\71345433\volume5\*.zip" "D:\Temp\StackOverflow\71345433\volume5\*.rar") DO (
FOR %C IN ("D:\Temp\StackOverflow\71345433\volume1\*.zip" "D:\Temp\StackOverflow\71345433\volume1\*.rar") DO (
FOR %C IN ("D:\Temp\StackOverflow\71345433\volume2\*.zip" "D:\Temp\StackOverflow\71345433\volume2\*.rar") DO (
FOR %C IN ("D:\Temp\StackOverflow\71345433\volume3\*.zip" "D:\Temp\StackOverflow\71345433\volume3\*.rar") DO (
FOR %C IN ("D:\Temp\StackOverflow\71345433\volume4\*.zip" "D:\Temp\StackOverflow\71345433\volume4\*.rar") DO (
Then we try to build the extraction commands:
FOR %%C IN ("%Folder%\*.zip" "%Folder%\*.rar") DO (
ECHO;"%ProgramFiles%\7-Zip\7z.exe" e -o"%ExtractFolder%" "%%~C"
)
Check if results look correct:
"C:\Program Files\7-Zip\7z.exe" e -o"D:\Temp\StackOverflow\71345433\volume5\Extract" "D:\Temp\StackOverflow\71345433\volume5\Last Zip file.zip"
"C:\Program Files\7-Zip\7z.exe" e -o"D:\Temp\StackOverflow\71345433\volume1\Extract" "D:\Temp\StackOverflow\71345433\volume1\SomeZipFile.zip"
"C:\Program Files\7-Zip\7z.exe" e -o"D:\Temp\StackOverflow\71345433\volume2\Extract" "D:\Temp\StackOverflow\71345433\volume2\JustAnotherZip.zip"
"C:\Program Files\7-Zip\7z.exe" e -o"D:\Temp\StackOverflow\71345433\volume3\Extract" "D:\Temp\StackOverflow\71345433\volume3\YetAnotherZip.zip"
"C:\Program Files\7-Zip\7z.exe" e -o"D:\Temp\StackOverflow\71345433\volume4\Extract" "D:\Temp\StackOverflow\71345433\volume4\How Many Zips Was This.zip"
In stage 3 we try it for real - remove the echo:
"%ProgramFiles%\7-Zip\7z.exe" e -o"%ExtractFolder%" "%%~C"
Check if we like the results (You can see I'm using some old latitude-e5440 PDFs I happen to find in a forgotten folder someplace):
D:\Temp\StackOverflow\71345433>dir /s /b
D:\Temp\StackOverflow\71345433\DragDropAndExtract.CMD
D:\Temp\StackOverflow\71345433\volume1
D:\Temp\StackOverflow\71345433\volume2
D:\Temp\StackOverflow\71345433\volume3
D:\Temp\StackOverflow\71345433\volume4
D:\Temp\StackOverflow\71345433\volume5
D:\Temp\StackOverflow\71345433\volume1\Extract
D:\Temp\StackOverflow\71345433\volume1\SomeZipFile.zip
D:\Temp\StackOverflow\71345433\volume1\Extract\lat_e_reimage_guide_en-us.pdf
D:\Temp\StackOverflow\71345433\volume2\Extract
D:\Temp\StackOverflow\71345433\volume2\JustAnotherZip.zip
D:\Temp\StackOverflow\71345433\volume2\Extract\latitude-e5440-laptop_owners-manual_en-us.pdf
D:\Temp\StackOverflow\71345433\volume3\Extract
D:\Temp\StackOverflow\71345433\volume3\YetAnotherZip.zip
D:\Temp\StackOverflow\71345433\volume3\Extract\latitude-e5440-laptop_user's guide_en-us.pdf
D:\Temp\StackOverflow\71345433\volume4\Extract
D:\Temp\StackOverflow\71345433\volume4\How Many Zips Was This.zip
D:\Temp\StackOverflow\71345433\volume4\Extract\latitude-e5440-laptop_users-guide_en-us.pdf
D:\Temp\StackOverflow\71345433\volume5\Extract
D:\Temp\StackOverflow\71345433\volume5\Last Zip file.zip
D:\Temp\StackOverflow\71345433\volume5\Extract\latitude-e5440-laptop_white papers_en-us.pdf
For stage 4 we echo both the extract command and xcopy command to see what they look like:
ECHO;"%ProgramFiles%\7-Zip\7z.exe" e -o"%ExtractFolder%" "%%~C"
ECHO; XCOPY /V /C /Y "%ExtractFolder%\*.*" "%CmdPath%\%SubFolderName%.*"
Just a reminder, every test is done by dragging the 5 folders onto the batch file:
"C:\Program Files\7-Zip\7z.exe" e -o"D:\Temp\StackOverflow\71345433\volume5\Extract" "D:\Temp\StackOverflow\71345433\volume5\Last Zip file.zip"
XCOPY /V /C /Y "D:\Temp\StackOverflow\71345433\volume5\Extract\*.*" "D:\Temp\StackOverflow\71345433\\volume5.*"
"C:\Program Files\7-Zip\7z.exe" e -o"D:\Temp\StackOverflow\71345433\volume1\Extract" "D:\Temp\StackOverflow\71345433\volume1\SomeZipFile.zip"
XCOPY /V /C /Y "D:\Temp\StackOverflow\71345433\volume1\Extract\*.*" "D:\Temp\StackOverflow\71345433\\volume1.*"
"C:\Program Files\7-Zip\7z.exe" e -o"D:\Temp\StackOverflow\71345433\volume2\Extract" "D:\Temp\StackOverflow\71345433\volume2\JustAnotherZip.zip"
XCOPY /V /C /Y "D:\Temp\StackOverflow\71345433\volume2\Extract\*.*" "D:\Temp\StackOverflow\71345433\\volume2.*"
"C:\Program Files\7-Zip\7z.exe" e -o"D:\Temp\StackOverflow\71345433\volume3\Extract" "D:\Temp\StackOverflow\71345433\volume3\YetAnotherZip.zip"
XCOPY /V /C /Y "D:\Temp\StackOverflow\71345433\volume3\Extract\*.*" "D:\Temp\StackOverflow\71345433\\volume3.*"
"C:\Program Files\7-Zip\7z.exe" e -o"D:\Temp\StackOverflow\71345433\volume4\Extract" "D:\Temp\StackOverflow\71345433\volume4\How Many Zips Was This.zip"
XCOPY /V /C /Y "D:\Temp\StackOverflow\71345433\volume4\Extract\*.*" "D:\Temp\StackOverflow\71345433\\volume4.*"
Stage 5, try it live:
"%ProgramFiles%\7-Zip\7z.exe" e -o"%ExtractFolder%" "%%~C"
XCOPY /V /C /Y "%ExtractFolder%\*.*" "%CmdPath%\%SubFolderName%.*"
What did we get?:
D:\Temp\StackOverflow\71345433>dir /s/b
D:\Temp\StackOverflow\71345433\volume1
D:\Temp\StackOverflow\71345433\volume1.pdf
D:\Temp\StackOverflow\71345433\volume2
D:\Temp\StackOverflow\71345433\volume2.pdf
D:\Temp\StackOverflow\71345433\volume3
D:\Temp\StackOverflow\71345433\volume3.pdf
D:\Temp\StackOverflow\71345433\volume4
D:\Temp\StackOverflow\71345433\volume4.pdf
D:\Temp\StackOverflow\71345433\volume5
D:\Temp\StackOverflow\71345433\volume5.pdf
Stage 6, what will remove directory look like? (Decided to hide the other commands with REM)
REM "%ProgramFiles%\7-Zip\7z.exe" e -o"%ExtractFolder%" "%%~C"
REM XCOPY /V /C /Y "%ExtractFolder%\*.*" "%CmdPath%\%SubFolderName%.*"
ECHO;RD /Q /S "%Folder%"
And we have:
RD /Q /S "D:\Temp\StackOverflow\71345433\volume5"
RD /Q /S "D:\Temp\StackOverflow\71345433\volume1"
RD /Q /S "D:\Temp\StackOverflow\71345433\volume2"
RD /Q /S "D:\Temp\StackOverflow\71345433\volume3"
RD /Q /S "D:\Temp\StackOverflow\71345433\volume4"
Stage 7 is the final code and tests:
@ECHO OFF
GOTO :Start
:LoopThroughParameters
SET CmdPath=%~1
SHIFT
:ltpLoop
IF [%1] EQU [] GOTO :EOF
SET Folder=%~1
SET SubFolderName=%~nx1
SET ExtractFolder=%~1\Extract
FOR %%C IN ("%Folder%\*.zip" "%Folder%\*.rar") DO (
"%ProgramFiles%\7-Zip\7z.exe" e -o"%ExtractFolder%" "%%~C"
XCOPY /V /C /Y "%ExtractFolder%\*.*" "%CmdPath%\%SubFolderName%.*"
RD /Q /S "%Folder%"
)
SHIFT
GOTO :ltpLoop
:Start
CALL :LoopThroughParameters "%~dp0" %*
PAUSE
All folders were deleted when done.
Now, let's do something experimental. I've never seen this fail, but I haven't used it that often. Let's give it a try:
@ECHO OFF
GOTO :Start
:LoopThroughParameters
SET CmdPath=%~1
SHIFT
:ltpLoop
IF [%1] EQU [] GOTO :EOF
SET Folder=%~1
SET SubFolderName=%~nx1
SET ExtractFolder=%~1\Extract
FOR %%C IN ("%Folder%\*.zip" "%Folder%\*.rar") DO (
(
"%ProgramFiles%\7-Zip\7z.exe" e -o"%ExtractFolder%" "%%~C"
) && (
XCOPY /V /C /Y "%ExtractFolder%\*.*" "%CmdPath%\%SubFolderName%.*"
) && (
RD /Q /S "%Folder%"
) || (
PowerShell Write-Host -ForegroundColor red "Error:"
PAUSE
)
)
SHIFT
GOTO :ltpLoop
:Start
CALL :LoopThroughParameters "%~dp0" %*
If any of the commands separated by && fail, then execution jumps to the command prefixed by ||. But if all of the commands separated by && succeed without throwing an error code, then the command prefixed by || is skipped. In theory, this will prevent the folder from being deleted, and pause the code, if there is problem.
So, we re-created the folders, and then used HxD to the damage zip file in volume4 folder.

It worked perfectly! Folder volume4 was not deleted. Tried the test again, this time damaging the PDF in folder volume2, worked perfectly!
As you can tell, I can do things in Batch that many can't do in PowerShell, and yes @Olaf, that's not necessarily something to be proud of! ;)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/438166.html
標籤:批处理文件
上一篇:通過SOAP代理spring不支持的媒體型別multipart/related;型別=“應用程式/xop xml”;邊界
下一篇:批處理:迭代.csv檔案列
