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

时间:2015-03-18 10:25:33

标签: windows batch-file command-line rename file-management

我有以下名称的数百个图像文件:

2008新加坡麦克拉伦汉密尔顿

1988_senna_mclaren_italy

senna 1985_portugal_lotus

schumacher_1998_great_britain ferrari

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

2008 - 新加坡 - 麦克拉伦 - 汉密尔顿

1988年 - 意大利 - 麦克拉伦 - 塞纳

1985年 - 葡萄牙 - 莲花 - 塞纳

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

01)一般视图应为:

年 - #CIRCUIT - #TEAM - #DRIVER

02)所有单词都应以大写字母

开头

03)在我想要“ - ”(空格,干草,空间)的单词之间。

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

年 - 电路 - 团队 - 驾驶员

年 - 电路 - 团队 - 驾驶员(2)

年 - 电路 - 团队 - 驾驶员(3)

...

年 - 电路 - 团队 - 驱动程序(10)

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


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

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

2 个答案:

答案 0 :(得分:1)

你可以试试这个

@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

答案 1 :(得分:1)

以下方法只需要您完成单词的大小写。您可以在这里查看“批量大写单词”。

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

@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