在Windows批处理文件中交换文件名内的字符

在Windows批处理文件中交换文件名内的字符

我有一个包含图片文件的文件夹。文件名结构是ddmmyy2222.png其中 dd=日,mm=月,yy=年。我试图根据结构重命名它们yyyymmdd像这样:

120516222.png => 20160512.png

010616222.png => 20160601.png

190316222.png => 20160316.png

% 和 " 让我抓狂。我最后的尝试是:

FOR /F %%n IN ('dir /b') DO (

设置“旧文件=%%n”

设置“d=%oldfile:~0,2%”

设置“m=%oldfile:~2,2%”

设置“y=%oldfile:~4,2%”

设置“新文件=20%y%%m%%d%”

回显。%新文件%

但我甚至无法访问 RENAME 语句,因为我没有在 ECHO 中获得所需的内容。出了什么问题?非常感谢!


答案1

怎么了

你需要启用延迟扩展

  • 延迟扩展将导致变量在执行时而不是在解析时扩展。

使用以下批处理文件(test.cmd):

@echo off
setlocal EnableDelayedExpansion
for /f %%n in ('dir /b *.png') do (
  set "oldfile=%%n"
  set "d=!oldfile:~0,2!"
  set "m=!oldfile:~2,2!"
  set "y=!oldfile:~4,2!"
  set "newfile=20!y!!m!!d!"
  echo.!newfile!
  )
endlocal

笔记:

  • dir根据需要修改命令。
  • %variable%!variable!在使用延迟扩展时将被替换。

例子:

F:\test>dir *.png
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

02/06/2016  21:23                 0 010616222.png
02/06/2016  21:23                 0 120516222.png
02/06/2016  21:23                 0 90316222.png
               3 File(s)              0 bytes
               0 Dir(s)  1,769,583,063,040 bytes free

F:\test>test
20160601
20160512
20623190

F:\test>

进一步阅读

相关内容