使用解析字符串重命名批处理脚本中的文件
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
,然后就可以开始了。但首先测试它,确保它不会尝试重命名您目录中的任何内容,它不应该重命名。
我很难理解 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
,然后就可以开始了。但首先测试它,确保它不会尝试重命名您目录中的任何内容,它不应该重命名。