考虑到某些权重,如何批量重命名文件?
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
我有数百个图像文件在此名称下:
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