MS Batch,按 Excel 或 CSV 列表中的模式重命名文件
MS Batch, Rename files by pattern in Excel or CSV list
我的文档名称如下:
foo_baar_AB_01.ending
fOo_BaAr_BC_05.ending
FOo_baaR_BA_15.ending
还有一个 Excel 或 CSV 列表,其中包含用于重命名文件的规则集:
AB ; Data
BC ; Stuff
BA ; Other
我的任务是重命名文件。结果应如下所示:
foo_baar_AB_01.Data.ending
fOo_BaAr_BC_05.Stuff.ending
FOo_baaR_BA_15.Other.ending
是否有将 Exel-Pattern-List 集成到批处理文件中的解决方案,或者我是否必须将 Pattern-List 集成到批处理文件中?这个问题的解决方案是什么?
这里有一个 excel 宏来执行您想要的操作。在您的 excel 文件中,将规则放入名为 rules 的 sheet 中,如下所示:
COLUMN A COOLUMN B
AB Data
BC Stuff
在宏行 Set objFolder = objFSO.GetFolder("C:\files") 中更改文件路径。和 运行 宏。希望对你有帮助。
Sub renameFiles()
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Set rulesSheet = ActiveWorkbook.Worksheets("rules")
'Create an instance of the FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Get the folder object
Set objFolder = objFSO.GetFolder("C:\files")
'loops through each file in the directory
For Each objFile In objFolder.Files
Filename = objFile.Path
' loop ruleset
rulesrow = 1
Do While (rulesSheet.Cells(rulesrow, 1) <> "")
rule = Trim(rulesSheet.Cells(rulesrow, 1))
newtext = Trim(rulesSheet.Cells(rulesrow, 2))
pos = InStr(Filename, rule)
If pos > 0 Then ' if the rule exists in your file name
newfilename = objFSO.getparentfoldername(Filename) & "\" & objFSO.GetBaseName(Filename) & "." & newtext & "." & objFSO.getextensionname(Filename)
' rename
Name Filename As newfilename
End If
rulesrow = rulesrow + 1
Loop
Next objFile
End Sub
@echo off
setlocal EnableDelayedExpansion
rem Load the list of names from the ruleset
for /F "tokens=1,2 delims=; " %%a in (list.csv) do (
set "name[%%a]=%%b"
)
rem Process the files
for /F "tokens=1-5 delims=_." %%a in ('dir /B /A-D *.ending') do (
ECHO ren "%%a_%%b_%%c_%%d.%%e" "%%a_%%b_%%c_%%d.!name[%%c]!.%%e"
)
确认名称正确后,从ren
命令中删除ECHO
部分。
嵌套 for
循环可以解决这个问题——请参阅解释性 rem
备注:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define rule-set CSV file here:
set "RULES=%~dp0ruleset.csv"
rem // Resolve the files to rename, provided as command line arguments:
for %%F in (%*) do (
rem // Extract the third `_`-delimited token from file name:
for /F "tokens=3 delims=_" %%N in ("%%~nF") do (
rem // Read the rule-set CSV file (`delims=;<TAB><SPACE>`!):
for /F "usebackq tokens=1,* delims=; " %%I in ("%RULES%") do (
rem // Check whether third token from file name matches rule:
if /I "%%I"=="%%N" (
rem // File name matches, so rename file finally:
ECHO rename "%%~F" "%%~nF.%%J%%~xF"
)
)
)
)
endlocal
exit /B
这肯定不是性能最好、效率最高的方法,但它很容易理解。
测试输出后,去掉rename
前的大写ECHO
命令。
我的文档名称如下:
foo_baar_AB_01.ending
fOo_BaAr_BC_05.ending
FOo_baaR_BA_15.ending
还有一个 Excel 或 CSV 列表,其中包含用于重命名文件的规则集:
AB ; Data
BC ; Stuff
BA ; Other
我的任务是重命名文件。结果应如下所示:
foo_baar_AB_01.Data.ending
fOo_BaAr_BC_05.Stuff.ending
FOo_baaR_BA_15.Other.ending
是否有将 Exel-Pattern-List 集成到批处理文件中的解决方案,或者我是否必须将 Pattern-List 集成到批处理文件中?这个问题的解决方案是什么?
这里有一个 excel 宏来执行您想要的操作。在您的 excel 文件中,将规则放入名为 rules 的 sheet 中,如下所示:
COLUMN A COOLUMN B
AB Data
BC Stuff
在宏行 Set objFolder = objFSO.GetFolder("C:\files") 中更改文件路径。和 运行 宏。希望对你有帮助。
Sub renameFiles()
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Set rulesSheet = ActiveWorkbook.Worksheets("rules")
'Create an instance of the FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Get the folder object
Set objFolder = objFSO.GetFolder("C:\files")
'loops through each file in the directory
For Each objFile In objFolder.Files
Filename = objFile.Path
' loop ruleset
rulesrow = 1
Do While (rulesSheet.Cells(rulesrow, 1) <> "")
rule = Trim(rulesSheet.Cells(rulesrow, 1))
newtext = Trim(rulesSheet.Cells(rulesrow, 2))
pos = InStr(Filename, rule)
If pos > 0 Then ' if the rule exists in your file name
newfilename = objFSO.getparentfoldername(Filename) & "\" & objFSO.GetBaseName(Filename) & "." & newtext & "." & objFSO.getextensionname(Filename)
' rename
Name Filename As newfilename
End If
rulesrow = rulesrow + 1
Loop
Next objFile
End Sub
@echo off
setlocal EnableDelayedExpansion
rem Load the list of names from the ruleset
for /F "tokens=1,2 delims=; " %%a in (list.csv) do (
set "name[%%a]=%%b"
)
rem Process the files
for /F "tokens=1-5 delims=_." %%a in ('dir /B /A-D *.ending') do (
ECHO ren "%%a_%%b_%%c_%%d.%%e" "%%a_%%b_%%c_%%d.!name[%%c]!.%%e"
)
确认名称正确后,从ren
命令中删除ECHO
部分。
嵌套 for
循环可以解决这个问题——请参阅解释性 rem
备注:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define rule-set CSV file here:
set "RULES=%~dp0ruleset.csv"
rem // Resolve the files to rename, provided as command line arguments:
for %%F in (%*) do (
rem // Extract the third `_`-delimited token from file name:
for /F "tokens=3 delims=_" %%N in ("%%~nF") do (
rem // Read the rule-set CSV file (`delims=;<TAB><SPACE>`!):
for /F "usebackq tokens=1,* delims=; " %%I in ("%RULES%") do (
rem // Check whether third token from file name matches rule:
if /I "%%I"=="%%N" (
rem // File name matches, so rename file finally:
ECHO rename "%%~F" "%%~nF.%%J%%~xF"
)
)
)
)
endlocal
exit /B
这肯定不是性能最好、效率最高的方法,但它很容易理解。
测试输出后,去掉rename
前的大写ECHO
命令。