Windows 重命名具有模式的多个文件夹中的多个文件

Windows 重命名具有模式的多个文件夹中的多个文件

我有一个文件夹,里面有多个子文件夹(只有一个级别),每个子文件夹包含多个文件。名称有一些动态前缀,我想根据其中的模式将其删除。

1. constant_1234_5382_0_file_name.txt      --> file_name.txt
2. constant_1234_5382_1_file-name.xls      --> file-name.xls
3. constant_12324_58382_20_file-name.pdf   --> file-name.pdf

如果您可以看到模式是删除所有前缀直到第 4 个“_”,那么我想到下面类似的内容,因为我对 Windows 脚本还不熟悉。

rename "*_*_*_*_*" "/////////*.txt"

上述命令的问题是我必须知道前缀的确切长度并/在其中添加相等数量的前缀。我可以通过多次运行并进行一些更改来对 1 个文件夹执行此操作,但我必须对 500 多个文件夹运行此操作,这是不可能的,或者是一项非常繁忙的任务,可能会出错。

我尝试了 Windows 帮助中的重命名,但没有帮助,在 Google 上,其他每个结果都具有某种需要更新的常量前缀或长度,这对我没有帮助,因为我需要修剪所有值直到第 4 个“ _”,而不管它们之间的内容来自多个文件夹。注意:文件可能有额外的下划线,我们必须保持原样。

答案1

@echo off 

for /r %%i in (*_*.*)do for /f tokens^=5*delims^=_ %%I in ('echo\%%~i')do ( 
    if "%%~J"=="" (set "_target=%%~I") else set "_target=%%~I_%%~J"
    %ComSpec% /v:on /s /c "rename "%%~i" "!_target!""
    )

  1. 递归列出您的文件并使用它们获取命令的路径/名称rename
for /r %%i in (*_*.*)do ...
    ...
    %ComSpec% /v:on /s /c "rename "%%~i" "!_target!""
  1. 在第二个循环中使用tokens^=5+ all ( )来定义目标名称:*for
for /r %%i ... for /f tokens^=5*delims^=_ %%I in ('echo\%%~i')do (
    ... (set "_target=%%~I") else set "_target=%%~I_%%~J"
    %ComSpec% /v:on /s /c "rename "%%~i" "!_target!""
    )
  1. 使用 anif检查第五个分隔符 ( ) 后是否还有更多字符串,如果有,则通过在目标名称后添加+%%~J返回分隔符_%%~J
if "%%~J"=="" (set "_target=%%~I") else set "_target=%%~I_%%~J"

相关内容