繁体   English   中英

使用解析字符串重命名批处理脚本中的文件

[英]Rename files in Batch script using parse string

我正在努力理解 Batch 上的所有命令,我遇到了一个问题。

我有这样的文件:

Rimouski 04-01-2021.txt
Rimouski 05-01-2021.txt
Rimouski 06-01-2021.txt
Rimouski 07-01-2021.txt
Rimouski 08-01-2021.txt

我希望他们像这样重命名:

Rimouski 2021-01-04.txt
Rimouski 2021-01-05.txt
Rimouski 2021-01-06.txt
Rimouski 2021-01-07.txt
Rimouski 2021-01-08.txt

我基本上只是想把日期倒过来。

我无法更改原始名称以删除空间,我必须使用这个确切的名称。

我知道我可以通过以下文件 go :

for /f %%a in ('dir /b "*.txt"') do ( )

我应该使用命令Ren ,但这就是我所知道的。

我还想要一个可以在“任何地方”使用和重用的解决方案。 类似于解析字符串并按照我想要的顺序更改片段。

阅读help for ,注意tokens 另外help set ,它允许您设置一个等于其输入的 substring 的变量。 所以你基本上想使用for循环来分割空间上的文件名,这是默认的分隔符,然后将第二个标记分成Year、Month、Day变量,然后在重命名时将它们重新组合在一起。

所以第一步是让循环和文件搜索正常工作:

@for /f "tokens=1,2" %%I in ('dir /A-d /b "* ??-??-????.txt"') do @echo %%I %%J

这会在我的测试目录中产生以下内容:

> test
Rimouski 04-01-2021.txt
Rimouski 04-02-2021.txt
Rimouski 04-03-2021.txt
Rimouski 04-04-2021.txt

而且我那里还有一些其他文件,所以我知道它的过滤效果很好。

现在解析并将事物重新组合在一起,加上一些脚本卫生:

@setlocal EnableExtensions
@set prompt=$G

@for /f "tokens=1,2,*" %%I in ('dir /A-d /b "* ??-??-????.txt"') do @call :DoIt "%%I" %%J %%K
@exit /b 0

:DoIt
@if "%~3" neq "" (@echo %1 does not match file filter. & exit /b 0)
@set "_prefix=%~1"
@set "_postfix=%~2"
@set "_dd=%_postfix:~0,2%"
@set "_mm=%_postfix:~3,2%"
@set "_yyyy=%_postfix:~6,4%"
@set "_ext=%_postfix:~10%"
@set "_newFileName=%_yyyy%-%_mm%-%_dd%%_ext%"
@echo ren "%_prefix% %_postfix%" "%_prefix% %_newFileName%"
@exit /b 0

您现在要做的就是从@echo ren行前面删除@echo ,然后准备好go。 但首先测试它,确保它没有尝试重命名目录中的任何内容,它不应该重命名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM