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

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

我基本上只是想让日期倒转。

我不能更改原来的名字来删除space,我必须用这个确切的名字来做。

我知道我可以通过以下方式浏览文件:

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

我应该使用命令 Ren,但我只知道这些。

我还想要一个可以“随处”使用和重复使用的解决方案。诸如解析字符串并按我想要的顺序更改片段之类的东西。

阅读help for,关注tokens。此外 help set,它允许您将变量设置为等于其输入的子字符串。所以你基本上想使用 for 循环在 space 上拆分文件名,这是默认分隔符,然后将第二个标记拆分为年、月、日变量,然后将它们拼凑回重命名。

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

@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,然后就可以开始了。但首先测试它,确保它不会尝试重命名您目录中的任何内容,它不应该重命名。