首页 > 解决方案 > 如何使用批处理脚本重命名具有多个条件的不同子目录中的 PNG 文件?

问题描述

我有一个工作文件夹。在该文件夹中有多个子文件夹。每个子文件夹有 100 个 png 文件。

100 个 png 文件的名称包括 X 和 Y 坐标,它们代表 10x10 网格中的位置。

每个 png 都有一个类似于 [ArbitraryFileName] [xCoordinate] [yCoordinate].png 的名称格式。坐标范围从 0 到 9。示例:

.../Root Folder/Layer 0/layer0_x00_y00.png
.../Root Folder/Layer 0/layer0_x01_y09.png
.../Root Folder/ArbitraryFolderName/AbitraryFileName_x01_y09.png
.../Root Folder/Layer 14/layer14_x00_y00.png
.../Root Folder/Layer 43/layer43_x00_y00.png

我需要脚本做的就是重命名文件并反转每个集合的 Y 坐标顺序。

layer0_x00_y00.png would be renamed to layer0_x00_y09.png
layer0_x00_y01.png would be renamed to layer0_x00_y08.png
layer0_x00_y02.png would be renamed to layer0_x00_y07.png
layer0_x00_y03.png would be renamed to layer0_x00_y06.png
layer10_x09_y09.png would be renamed to layer10_x09_y00.png
RandomFile_x00_y00.png would be renamed to RandomFile_x00_y09.png

等等。

我需要做的就是

我对批处理脚本有非常基本的了解,因此我根据需要整理了以下代码,但它不会遍历子文件夹,并且再次使用时也不起作用。我究竟做错了什么?有人可以帮助我吗?

@echo off
setlocal enabledelayedexpansion
for /R %%a in (*_*.png) do (`
  set file=%%a
  ren "!file!" "!file:_=M!"
)
pause

setlocal enabledelayedexpansion
SET old1=My00
SET new1=_y09

SET old2=My01
SET new2=_y08

SET old3=My02
SET new3=_y07

SET old4=My03
SET new4=_y06

SET old5=My04
SET new5=_y05

SET old6=My05
SET new6=_y04

SET old7=My06
SET new7=_y03

SET old8=My07
SET new8=_y02

SET old9=My08
SET new9=_y01

SET old10=My09
SET new10=_y00

for /R "tokens=*" %%f in ('dir /b *.png') do (
SET newname=%%f
SET newname=!newname:%old1%=%new1%!
SET newname=!newname:%old2%=%new2%!
SET newname=!newname:%old3%=%new3%!
SET newname=!newname:%old4%=%new4%!
SET newname=!newname:%old5%=%new5%!
SET newname=!newname:%old6%=%new6%!
SET newname=!newname:%old7%=%new7%!
SET newname=!newname:%old8%=%new8%!
SET newname=!newname:%old9%=%new9%!
SET newname=!newname:%old10%=%new10%!
move "%%f" "!newname!"
)
pause

setlocal enabledelayedexpansion
SET oldx=Mx0
SET newx=_x0
for /R "tokens=*" %%f in ('dir /b *.png') do (
SET newname=%%f
SET newname=!newname:%oldx%=%newx%!
move "%%f" "!newname!"
)
pause
)

仅供参考,场景 01:(i) 1st FOR LOOPwith /R& (*_*.png) (ii) 2nd FOR LOOPwith /R& (*.png) (iii) 3rd FOR LOOPwith /R&(*.png)

结果:完全没有变化。没有以任何方式重命名的文件。

场景 02:(i) 1st FOR LOOPwith /R& (*_*.png) (ii) 2nd FOR LOOPwith /F& ('dir /b *.png') (iii) 3rd FOR LOOPwith /F&('dir /b *.png')

结果:(i)“命令的语法不正确”(ii)“找不到文件”。(iii) “找不到文件”。

场景 03:(i) 1st FOR LOOPwith /R& (*_*.png) (ii) 2nd FOR LOOPwith /F& ('dir /b /s *.png') (iii) 3rd FOR LOOPwith /F&('dir /b /s *.png')

结果:(i)“命令的语法不正确”(ii)对每个文件说“1个文件已移动”。(iii) 对每个文件说“1 个文件已移动”。但文件名没有变化。

标签: batch-filescript

解决方案


有了这个,你也可以为 X 应用规则:

@ECHO off
SETLOCAL enableDelayedExpansion

FOR /R %%F in (*_*.png) DO (
  FOR /F "usebackq tokens=1,2,3 delims=_." %%w in ('%%F') do (
  
    SET    x=%%x
    SET    x=!x:x=!
    
    SET    y=%%y
    SET /a y=1!y:y=!-100
    SET /a y=9-!y!
    SET    y=0!y!
    
    MOVE "%%F" "%%w_x!x!_y!y!%%~xF" 
  )
)

说明:目录树中的
> FOR /R %%F in (*_*.png) 所有“ _.png ”文件和符号链接。

FOR /F 根据引号改变参数的处理方式,字面量为“字符串”。

"usebackq" 新 更改启用其他资源的参数的处理。现在文字是“字符串”。

tokens=1,2,3 delims=_." %%w 将 %%w 设置为第一个 '_' 分隔符之前的完整文件名。
并在扩展点后切断。
按照顺序 1:w 在 _ 之前,2:x 在 _ 之间,3:y 在 _ 和 之间。

('%%F') PNG 完整路径和名称作为文字字符串

SET y=!y:y=! 例如从 y00 中截取字符 y。只留下数字。这是变量的资源。

SET /a y=1!y:y=!-100 在 MSDOS 中作弊关于八进制数的问题。

SET /a y=9-!y! 现在你只有十进制数字,应用你的规则。

%%~xF" 文件的扩展名 (.png)。

调试代码用于说明:

@ECHO off
SETLOCAL enableDelayedExpansion

FOR /R %%F in (*_*.png) DO (
  FOR /F "usebackq tokens=1,2,3 delims=_." %%w in ('%%F') do (
  
    SET    x=%%x
    SET    x=!x:x=!
    
    SET    y=%%y
    SET /a y=1!y:y=!-100
    SET /a y=9-!y!
    SET    y=0!y!
    
    REM Debug your rules:
    ECHO x: %%x to !x!, y: %%y to !y!
    REM Echo your renaming:
    ECHO RENAME "%%F" "%%w_x!x!_y!y!%%~xF" 
  )
)

输出:

> changeAll.bat
x: 00 to 00, y: 00 to 09
RENAME "C:\stack\bar\layer0_x00_y00.png" "C:\stack\bar\layer0_x00_y09.png"
x: 00 to 00, y: 01 to 08
RENAME "C:\stack\bar\layer0_x00_y01.png" "C:\stack\bar\layer0_x00_y08.png"
x: 00 to 00, y: 02 to 07
RENAME "C:\stack\bar\layer0_x00_y02.png" "C:\stack\bar\layer0_x00_y07.png"
x: 00 to 00, y: 01 to 08
RENAME "C:\stack\foo\layer0_x00_y01.png" "C:\stack\foo\layer0_x00_y08.png"
x: 00 to 00, y: 02 to 07
RENAME "C:\stack\foo\layer0_x00_y02.png" "C:\stack\foo\layer0_x00_y07.png"
x: 00 to 00, y: 08 to 01
RENAME "C:\stack\bar\layer0_x00_y08.png" "C:\stack\bar\layer0_x00_y01.png"

推荐阅读