批次腳本

批次腳本

我試圖在某些條件下對文件目錄進行排序,但我一生都無法弄清楚這一點。這是一些要整理(刪除)的檔案名稱的小範例。

Turok 3 - Shadow of Oblivion (USA).zip
Turok 3 - Shadow of Oblivion (Europe).zip
Duke Nukem - Zero Hour (Europe).zip
Duke Nukem - Zero Hour (USA).zip
Gex 64 - Enter the Gecko (Europe).zip
NBA Jam 2000 (Europe).zip

我試圖保留每個文件的一個版本,但有一個問題讓這變得很困難。在上述情況下,我想保留“Gex 64”和“NBA Jam”文件,因為它們是唯一的文件。 《Turok》和《毀滅公爵》各有兩個版本,美國版和歐洲版,這裡我只想保留歐洲版。

我無法手動執行此操作,因為我們正在討論數千個文件。是否有用於此目的的軟體,或者命令列是否足夠強大,可以讓批次檔執行此操作?

答案1

批次腳本

該腳本可以處理多個副檔名,如果第一個參數中未指定,則預設為目前目錄。

筆記按原樣,該腳本只會列出應刪除的文件,但不會實際刪除它們。當您確定清單正確時,請將子程式REM del /f "%%~B"中的行替換:deleteDuplicatesdel /f "%%~B"。首先處理副本以確保沒有問題。

@echo off
setlocal
setlocal enabledelayedexpansion

REM ensure the target directory exists
if "%~1" == "" (
set targetDir=%~dp0
) else (
if not exist "%~1\" exit /b 2
set targetDir=%~1
)

REM set the working directory
pushd "%targetDir%"

REM set the file extensions to scan
set exts=*.zip
set preserve=^(Europe

REM initialize the name list
set nameList=%temp%\names_%random%%random%.txt

REM retrieve all file names
type nul>"%nameList%"
for /r %%G in (%exts%) do (
set name=%%~nG
set name=!name:%preserve%=$^(!
echo !name!%%~xG>>"%nameList%"
)

REM delete duplicates with similar names
call :deleteDuplicates "%nameList%"

del "%nameList%" 2>nul
popd
endlocal
echo. & pause
exit /b

:deleteDuplicates
setlocal
set tempFile=%~dp1tmp-%~nx1
sort "%~1" /o "%tempFile%"
type nul>"%~1"
set last=
for /f "delims=" %%A in (%tempFile%) do (
for /f "tokens=1 delims=$(" %%B in ('echo %%A') do (set current=%%B)
if "!current!" == "!last!" (
echo %%~A>>"%~1"
) else (
set last=!current!
))
for /f "delims=" %%A in (%~1) do (
for /f "delims=" %%B in ('"dir /b /s "%%~A" 2>nul"') do (
echo %%B
REM del /f "%%~B"
))
del "%tempFile%" 2>nul
endlocal & exit /b

怎麼運作的

  1. 取得與指定副檔名相符的所有檔案的列表,並在其名稱中替換(Europe為。$(
  2. 按字母順序對文件列表進行排序。
  3. 透過比較相似文件的名稱來建立相似文件的清單。
  4. 列出並刪除找到的重複項。

已知的限制

  • 該腳本假定除檔案名稱末尾之外沒有括號(例如Something (Whatever).ext)。
  • 前面的前導空格(也被考慮。
  • $字元是為了排序目的而保留的,它根本不應該出現在檔案名稱中。

相關內容