Batch-Skript

Batch-Skript

Ich versuche, ein Verzeichnis mit Dateien nach bestimmten Bedingungen zu sortieren, aber ich komme einfach nicht dahinter. Hier ist ein kleines Beispiel einiger Dateinamen, die aussortiert (gelöscht) werden sollen.

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

Ich versuche, eine Ausgabe jeder Datei zu behalten, aber es gibt einen Haken, der das erschwert. Im obigen Fall würde ich die Dateien „Gex 64“ und „NBA Jam“ behalten wollen, weil sie die einzigen sind, die es gibt. „Turok“ und „Duke Nukem“ haben jeweils zwei Ausgaben, USA und Europa, und hier möchte ich nur die europäischen behalten.

Ich kann das nicht manuell machen, da es sich um Tausende von Dateien handelt. Gibt es eine Software dafür oder ist die Befehlszeile leistungsstark genug, um dies mit einer Batchdatei erledigen zu lassen?

Antwort1

Batch-Skript

Das Skript kann mehrere Erweiterungen verarbeiten und greift standardmäßig auf das aktuelle Verzeichnis zu, wenn im ersten Parameter keines angegeben ist.

NotizSo wie es ist, listet das Skript nur die Dateien auf, die gelöscht werden sollen, löscht sie aber nicht wirklich. Wenn Sie sicher sind, dass die Liste korrekt ist, ersetzen Sie die REM del /f "%%~B"Zeile in der :deleteDuplicatesSubroutine durch del /f "%%~B". Arbeiten Sie zuerst an einer Kopie, um sicherzustellen, dass keine Probleme vorliegen.

@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

Wie es funktioniert

  1. Rufen Sie eine Liste aller Dateien ab, die mit der/den angegebenen Erweiterung(en) übereinstimmen, und ersetzen Sie (Europein $(ihren Namen „durch“.
  2. Sortieren Sie die Dateiliste alphabetisch.
  3. Erstellen Sie eine Liste ähnlicher Dateien, indem Sie ihre Namen vergleichen.
  4. Listen Sie die gefundenen Duplikate auf und löschen Sie sie.

Bekannte Einschränkungen

  • Das Skript geht davon aus, dass sich außer am Ende des Dateinamens (z. B. Something (Whatever).ext) keine Klammern befinden.
  • Führende Leerzeichen davor (werden berücksichtigt.
  • Das $Zeichen ist für Sortierzwecke reserviert und sollte in Dateinamen überhaupt nicht vorkommen.

verwandte Informationen