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

问题描述

我正在努力理解 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

我基本上只是希望日期颠倒。

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

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

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

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

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

解决方法

阅读help for,注意tokens。还有 help set,它允许您设置一个变量等于其输入的子字符串。所以你基本上想使用 for 循环来分割空格上的文件名,这是默认的分隔符,然后将第二个标记分成年、月、日变量,然后在重命名时将它们全部拼凑在一起。

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

@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 行前面删除 @echo ren,然后就可以开始了。但是首先要测试它,确保它没有尝试重命名您目录中的任何内容,它不应该重命名。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...