BATCH - 从文件名中删除一些字符

时间:2017-09-22 10:40:46

标签: csv batch-file

我有这个名字的文件:

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

但它不起作用。

请帮忙吗?

3 个答案:

答案 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"
)