批处理脚本

批处理脚本

我正在尝试根据某些条件对文件目录进行排序,但我无论如何也想不通。下面是一些需要排序(删除)的文件名的小示例。

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"中的行替换: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)。
  • 之前的前导空格(会被考虑进去。
  • $字符保留用于排序目的,它根本不应该出现在文件名中。

相关内容