Batch file 使用批处理重命名文件名的第一部分
我在为将替换文件名第一部分的批处理文件编写代码时遇到一些问题 假设我们有以下文件: abcd123.txtBatch file 使用批处理重命名文件名的第一部分,batch-file,rename,file-rename,batch-rename,Batch File,Rename,File Rename,Batch Rename,我在为将替换文件名第一部分的批处理文件编写代码时遇到一些问题 假设我们有以下文件: abcd123.txt abcd345.txt 数字部分(以及扩展名)是我想要保留的部分,并将其更改为blabla123.txt和blabla345.txt 数字部分并不总是相同的 我试着写: set FILE =%1 set LastPart = %FILE:~-7% set NewName = c:\MyFolder\blabla%LastPart% ren %FILE% %NewName% 但它不起
abcd345.txt 数字部分(以及扩展名)是我想要保留的部分,并将其更改为blabla123.txt和blabla345.txt
数字部分并不总是相同的 我试着写:
set FILE =%1
set LastPart = %FILE:~-7%
set NewName = c:\MyFolder\blabla%LastPart%
ren %FILE% %NewName%
但它不起作用,因为c:\MyFolder\blablabla到123.txt之间有空格,请查看下面的脚本是否对您有所帮助。它遍历给定目录中的所有文件,并根据您的要求重命名它们
@echo OFF
setlocal ENABLEDELAYEDEXPANSION
REM Get input directory from user
set /p INPUT_DIR=Please enter full path to directory with files, use double quotes if any space:
cd /d %INPUT_DIR%
for /f %%f in ('dir /b %INPUT_DIR%') do (
set newname=hello!fullname:~-7!
ren %%f !newname!
)
输出
E:>dir/b“E:\Temporary\SO\batch\Input-Space”
adad123.txt
E:>临时\SO\batch\test\u ren.bat
请输入包含文件的目录的完整路径,如果有,请使用双引号
空格:“E:\Temporary\SO\batch\Input-space”
E:>dir/b“E:\Temporary\SO\batch\Input-Space”
hello123.txt
也许:
SET "OldName=%~n1"
SET "Ext=%~x1"
SET "LastPart=%OldName:~-3%"
SET "FirstPart=blabla
SET "NewFold=C:\MyFolder"
REN "%~1" "%NewFold%\%FirstPart%%LastPart%%Ext%"
虽然这个问题对我来说不太清楚,但我决定提供一个答案,因为从字符串末尾提取数字部分的任务似乎不是那么简单,特别是在前面的字符串和数字部分可能具有不同长度的情况下 因此,这里有一个脚本,它接受作为命令行参数提供的文件路径/名称/模式,分离数字部分,为其添加可选前缀,并相应地重命名文件(实际上它只是回显
ren
命令行以进行测试;删除大写的ECHO
以实际重命名):
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
设置“前缀=”
对于%%F in(%*)do(
对于/F“令牌=1-2 delims=0123456789下线=0”%%%K in(“\u%%nF”)do(
如果“%%L”==”(
设置“FLOC=%%~F”
设置“文件=%%~nF”
设置“FEXT=%%~xF”
设置“FNEW=”
setlocal EnableDelayedExpansion
设置“文件=33;!文件!”
对于(0,1,9)do中的/L%%E(
设置“NAME=!FILE:%%E=%%E!”
如果不是“!NAME!”==”!文件!”(
如果1!名称!全球技术法规1!FNEW(
设置“FNEW=!NAME!”
)
)
)
ECHO ren“!FLOC!”!前缀!!FNEW!!FEXT!”
端部
)
)
)
端部
退出/B
脚本将跳过名称中包含少于或多于一个数字部分的所有文件,以及数字部分后面紧跟文件扩展名以外的内容的文件。例如,处理abcd1234.txt
,而跳过abcd1234.txt
、1234.txt
、ab1234cd.txt
、1234abcd.txt
和ab12cd34.txt
。请注意,数字部分仅限于九位十进制数字
如果九位数的限制令人不安,可以使用以下脚本。它与前面提到的非常相似,但数字比较已被字符串比较所取代,数字中填充前导零以使长度相等。因此,字符串比较提供与纯数字比较相同的结果:
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
设置“前缀=”
设置/A“DIGS=256”
setlocal EnableDelayedExpansion
对于(1,1,%DIGS%)中的/L%%E,请设置“PADZ=!PADZ!0”
endlocal&设置“PADZ=%PADZ%”
对于%%F in(%*)do(
对于/F“令牌=1-2 delims=0123456789下线=0”%%%K in(“\u%%nF”)do(
如果“%%L”==”(
设置“FLOC=%%~F”
设置“文件=%%~nF”
设置“FEXT=%%~xF”
设置“FNEW=”
setlocal EnableDelayedExpansion
设置“文件=33;!文件!”
对于(0,1,9)do中的/L%%E(
设置“NAME=!FILE:%%E=%%E!”
如果不是“!NAME!”==”!文件!”(
设置“CMPN=%PADZ%!NAME!”
设置“CMPF=%PADZ%!FNEW!”
如果“!CMPN:~-%DIGS%!”全球技术法规“!CMPF:~-%DIGS%!”(
设置“FNEW=!NAME!”
)
)
)
ECHO ren“!FLOC!”!前缀!!FNEW!!FEXT!”
端部
)
)
)
端部
退出/B
这是一种稳健且更灵活的方法,允许在变量
index
(负值从后面开始计数,因此-1
指向最后一个,如果您愿意):
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“PREFIX=blah”&rem/(用于新文件名的可选前缀)
set/A“INDEX=0”&rem/(`0`表示第一个数字部分,`1`表示最后一个数字部分)
rem//通过命令行参数循环:
对于%%F in(%*)do(
设置/A“CNT=-1”和设置“种类=”
对于/F“delims==eol=“%%E in('2^>num set“$PART[”)do set”%%E=”
rem//存储有关当前迭代文件的信息:
设置“FLOC=%%~F”
设置“文件=%%~nF”
设置“FEXT=%%~xF”
rem//切换延迟扩展以避免出现“!”问题:
setlocal EnableDelayedExpansion
rem//组合数字和非数字部分的文件名部分列表:
设置“LIST=”!FILE!“
对于(0,1,9)中的/L%%J,请设置“列表=!列表:%%J=“%%J”!”
设置“列表=!列表:“”
rem//确定文件名部分及其数量和种类:
对于(!LIST!)中的%%I,请执行以下操作(
endlocal&设置/A“CNT+=1”
设置“项=%%~I”&设置“测试=%%I”
setlocal EnableDelayedExpansion
如果“!TEST!”==”!ITEM!”(设置为“KND=0”)否则(设置为“KND=-”)
对于/F%%K in(“种类=!种类!!KND!”)执行以下操作(
对于/F“delims=“%%E in($PART[!CNT!]=!ITEM!”)执行以下操作(
endlocal&设置“%%K”和设置“%%E”
)
)
setlocal EnableDelayedExpansion
)
rem//检索所需的数字文件名部分:
如果%INDEX%lss为0(设置/A“索引=-(1+IN