我有一个文件夹,里面有多个子文件夹(只有一个级别),每个子文件夹包含多个文件。名称有一些动态前缀,我想根据其中的模式将其删除。
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!""
)
- 递归列出您的文件并使用它们获取命令的路径/名称
rename
:
for /r %%i in (*_*.*)do ...
...
%ComSpec% /v:on /s /c "rename "%%~i" "!_target!""
- 在第二个循环中使用
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!""
)
- 使用 an
if
检查第五个分隔符 ( ) 后是否还有更多字符串,如果有,则通过在目标名称后添加+%%~J
返回分隔符_
%%~J
if "%%~J"=="" (set "_target=%%~I") else set "_target=%%~I_%%~J"