Пакетный скрипт

Пакетный скрипт

Я пытаюсь отсортировать каталог файлов с некоторыми условиями, но я не могу понять, как это сделать. Вот небольшой пример некоторых имен файлов, которые нужно отсортировать (удалить).

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" и "Duke Nukem" есть по два издания, для США и Европы, а здесь я хочу сохранить только европейские.

Я не могу сделать это вручную, потому что речь идет о тысячах файлов. Есть ли программное обеспечение для этого, или командная строка достаточно мощна, чтобы пакетный файл сделал это?

решение1

Пакетный скрипт

Скрипт может обрабатывать несколько расширений и по умолчанию будет использовать текущий каталог, если в первом параметре не указано ни одного.

ПримечаниеКак есть, скрипт просто перечислит файлы, которые следует удалить, но на самом деле не удалит их. Когда вы убедитесь, что список правильный, замените строку REM del /f "%%~B"в :deleteDuplicatesподпрограмме на del /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).
  • Начальные пробелы перед (символами учитываются.
  • Этот $символ зарезервирован для целей сортировки и вообще не должен появляться в именах файлов.

Связанный контент