我有这个名字的文件:
FirstPart_SecondPart_ThirdPart.zip_FourthPart_FifthPartX.csv
其中X是一位数字。 它应该通过批处理脚本重命名为:
FirstPart_SecondPart_ThirdPart.zip_FifthPartX.csv
所以我想删除FourthPart。请注意,所有部件始终具有相同的长度。 FirstPart总是7位数,SecondPart总是9位......等等......
这是我尝试过的:
ren \*.zip_*FifthPart?.csv *.zip_FifthPart?.csv
但它不起作用。
请帮忙吗?
答案 0 :(得分:2)
在相应的目录中
...在命令提示符下:
For /F "EOL=_Tokens=1-4*Delims=_" %A In ('Dir/B/A-D "*_*_*_*_*.csv"') Do @Ren "%A_%B_%C_%D_%E" "%A_%B_%C_%E"
...在批处理文件中:
@For /F "EOL=_Tokens=1-4*Delims=_" %%A In ('Dir/B/A-D "*_*_*_*_*.csv"'
) Do @Ren "%%A_%%B_%%C_%%D_%%E" "%%A_%%B_%%C_%%E"
因为您已经确定文件名格式和字符数字,所以我认为最好的方法是使用Where
代替Dir
。
例如,批处理文件中的 :
FirstPart始终为7位,SecondPart始终为9位,ThirdPart始终为6位,FourthPart始终为5位,FifthPart始终为8位。
@For /F "EOL=_Tokens=1-4*Delims=_" %%A In (
'Where .:"???????_?????????_??????_?????_????????.csv"'
) Do @Ren "%%A_%%B_%%C_%%D_%%E" "%%A_%%B_%%C_%%E"
答案 1 :(得分:1)
解决这个问题的两种可能性:
(1)由于所有部分的长度始终相同,您只需使用子字符串来剪切FourthPart_
部分:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
FOR /F "tokens=*" %%G IN ('DIR /B *.csv') DO (
SET new_filename=%%G
SET new_filename=!new_filename:~0,35!!new_filename:~46!
ECHO REN "%%G" "!new_filename!"
)
(2)或者,如果FourthPart_
是一个静态字符串,您也可以使用搜索&删除FourthPart_
。替换:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
FOR /F "tokens=*" %%G IN ('DIR /B *.csv') DO (
SET new_filename=%%G
SET new_filename=!new_filename:FourthPart_=!
ECHO REN "%%G" "!new_filename!"
)
这些批处理文件只会输出要发出的命令。检查输出后删除ECHO
,您确信它可以满足您的需求。
答案 2 :(得分:1)
您可以使用for /F
loop拆分和重建文件名:
for /F "delims= eol=|" %%F in ('dir /B /A:-D "*_*_*_*_*.csv"') do (
for /F "tokens=1-4* delims=_ eol=_" %%A in ("%%F") do (
ren "%%F" "%%A_%%B_%%C_%%E"
)
)
鉴于没有任何部分本身包含下划线(_
)且没有一个是空的,单个循环就足够了:
for /F "tokens=1-4* delims=_ eol=_" %%A in ('dir /B /A:-D "*_*_*_*_*.csv"') do (
ren "%%A_%%B_%%C_%%D_%%E" "%%A_%%B_%%C_%%E"
)
这是一种使用findstr
对文件名进行额外过滤的方法,以排除与名称规范不匹配的文件:
for /F "tokens=1-4* delims=_ eol=_" %%A in ('
dir /B /A:-D "*_*_*_*_*.csv" ^| findstr /I "^[^_][^_]*_[^_][^_]*_[^_][^_]*_[^_][^_]*_[^_].*\.csv$"
') do (
ren "%%A_%%B_%%C_%%D_%%E" "%%A_%%B_%%C_%%E"
)