考虑到某些权重,如何批量重命名文件?

How can I bulk rename files taking into account some weights?

我有数百个图像文件在此名称下:

2008新加坡迈凯轮汉密尔顿

1988_senna_mclaren_italy

番泻叶1985_portugal_lotus

schumacher_1998_great_britain法拉利

我想重命名它们。例如,我希望它们看起来像:

2008 - 新加坡 - 迈凯轮 - 汉密尔顿

1988 - 意大利 - 迈凯轮 - 塞纳

1985 - 葡萄牙 - 莲花 - 塞纳

1998 - 英国 - 法拉利 - 舒马赫

01)一般的看法应该是:

年 - #CIRCUIT - #TEAM - #DRIVER

02) 所有的单词都要大写

03) 字与字之间我要“-”(space, hayfen, space).

04) 如果有重复的话,我希望照片在最后重命名为(#number)。如果有10张照片就会是这样:

年 - 电路 - 团队 - 车手

年 - 电路 - 团队 - 车手 (2)

年 - 电路 - 团队 - 车手 (3)

...

年 - 电路 - 团队 - 车手 (10)

我不想覆盖任何现有照片!


为此,我需要使用一些 ifs 来检查字符串中是否有四位数字。然后这应该放在新字符串的开头。之后,应添加“ - ”。然后,该算法应检查原始字符串中是否有国家名称(电路)。对于将有 20-30 个国家/地区名称的情况,我应该使用 if。要点:有两个名字的国家会让我的生活变得困难(例如英国)。也许我可以检查原始字符串中是否有像“Great”这样的词。添加电路名称后,“团队”名称和“驱动程序”的过程相同。

我的主要问题是哪种方法最好。作为第一步,我将通过将“_”替换为“”来重命名文件。其次,我会将所有单词以大写字母开头。然后,我可以添加 ifs 来完成我的任务。我可以使用命令行来完成还是应该创建一个批处理文件?我也可以为此使用一个工具,但我需要通过放置我需要的特定 ifs 来改变它的工作方式。谢谢你的时间。

你可以试试这个

@echo off &setlocal enabledelayedexpansion
set "CIRCUITS=Portugal\Singapore\Portugal\Great Britain\Bahrein\Italy"
set "TEAMS=Ferrari\McLaren\Lotus\Red Bull"
set "DRIVERS=Senna\Hamilton\Schumacher"
for /f "delims=" %%a in ('dir /b/a-d/on *.png *.jpg') do (
    call:GetYear "%%~a" year
    if not defined year exit /b
    call:GetString "%%~a" "%CIRCUITS%" circ
    if not defined circ exit /b
    call:GetString "%%~a" "%TEAMS%" team
    if not defined team exit /b
    call:GetString "%%~a" "%Drivers%" driver
    if not defined driver exit /b
    call:DoRename "%%~a" "!year! - !circ! - !team! - !driver!"
)
goto:eof

:GetYear
setlocal enabledelayedexpansion
set "FName=%~1"
for /l %%b in (1940,1,2015) do (
    if not "!FName:%%~b=!"=="%FName%" (
        endlocal&set "%~2=%%~b"
        exit /b
    )
)
echo Year not found in "%~1" &exit /b

:GetString
setlocal enabledelayedexpansion
set "Str=%~1"
set "Str=%Str:_= %"
set "Dict=%~2"
:next_1
for /f "delims=\" %%b in ("%Dict%") do (
    if not "!Str:%%~b=!"=="%Str%" (
        endlocal&set "%~3=%%~b"
        exit /b
    )
    set "Dict=!Dict:*%%~b=!"
)
if defined Dict goto:next_1
echo "%~1" has no match in "%~2" &exit /b

:DoRename
setlocal
set /a counter=1
:next_2
if %counter% gtr 1 (set "NewName=%~2 (%counter%)") else set "NewName=%~2"
set /a counter+=1
if /i not "%~1"=="%NewName%%~x1" if exist "%NewName%%~x1" goto:next_2
if not "%~1"=="%NewName%%~x1" (
    echo "%~1" --^> "%NewName%%~x1"
    ren "%~1" "%NewName%%~x1"
)
exit /b

下面的方法只需要你完成单词的大写即可。您可以在这里寻找 "batch capitalize words".

编辑:我修复了一个小错误并添加了大写方法。

@echo off
setlocal EnableDelayedExpansion

rem Define lists for teams and drivers
set teamList=Ferrari Lotus Mclaren
set driverList=Hamilton Schumacher Senna

for /F "delims=" %%a in ('dir /B *.jpg *.png') do (

   rem Initialize circuit
   set "circuit=%%a"
   set "circuit= !circuit:_= ! "

   rem Identify year
   for %%a in (!circuit!) do (
      if %%a gtr 1900 if %%a lss 2100 (
         set "year=%%a"
         set "circuit=!circuit: %%a = !"
      )
   )

   rem Identify team
   set "team="
   for %%a in (!circuit!) do (
      if "!teamList:%%a=!" neq "%teamList%" (
         set "team=%%a"
         set "circuit=!circuit: %%a = !"
      )
   )
   if defined team (
      call :Capitalize team
   ) else (
      echo Team not defined in list: "%%a"
      goto :EOF
   )

   rem Identify driver
   set "driver="
   for %%a in (!circuit!) do (
      if "!driverList:%%a=!" neq "%driverList%" (
         set "driver=%%a"
         set "circuit=!circuit: %%a = !"
      )
   )
   if defined driver (
      call :Capitalize driver
   ) else (
      echo Driver not defined in list: "%%a"
      goto :EOF
   )

   call :Capitalize circuit

   rem Check for duplicates
   set "newName=!year! - !circuit! - !team! - !driver!"
   set "number="
   if exist "!newName!" (
      for /L %%n in (2,1,20) do if not defined number (
         if not exist "!newName! (%%n)" set "number= (%%n)"
      )
   )

   ECHO ren "%%a" "!newName!!number!"

)
goto :EOF


:Capitalize var

set "var="
for %%a in (!%1!) do (
   set "name=%%a"
   set "char=!name:~0,1!"
   for %%b in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
      set "char=!char:%%b=%%b!"
   )
   set "var=!var! !char!!name:~1!"
)
set "%1=%var:~1%"
exit /B