如何使用批处理脚本重命名具有多个条件的不同子目录中的 PNG 文件?
How to rename PNG files in different sub directories with multiple condition using batch script?
我有一个工作文件夹。该文件夹中有多个子文件夹。每个子文件夹有 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
等等。
我需要做的就是
- 运行根目录下的脚本文件
- 让它重命名并反转根文件夹内所有子文件夹中所有图像的 Y 坐标顺序。
我对批处理脚本有非常基本的了解,所以我根据需要整理了以下代码,但它不会遍历子文件夹,再次使用时也不起作用。我究竟做错了什么?有人可以帮我解决这个问题吗?
@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) 第一 FOR LOOP
与 /R
& (*_*.png)
(ii) 第二 FOR LOOP
与 /R
& (*.png)
(iii) 第三 FOR LOOP
与 /R
& (*.png)
结果:完全没有变化。没有以任何方式重命名的文件。
场景02:
(i) 第一 FOR LOOP
与 /R
& (*_*.png)
(ii) 第二 FOR LOOP
与 /F
& ('dir /b *.png')
(iii) 第三 FOR LOOP
与 /F
& ('dir /b *.png')
结果:(i)“命令的语法不正确”
(ii) “找不到文件”。
(iii)“找不到文件”。
场景 03:
(i) 第一 FOR LOOP
与 /R
& (*_*.png)
(ii) 第二 FOR LOOP
与 /F
& ('dir /b /s *.png')
(iii) 第三 FOR LOOP
与 /F
& ('dir /b /s *.png')
结果:(i)“命令的语法不正确”
(ii) 对每个文件说“移动了 1 个文件”。
(iii) 对每个文件说“1 个文件已移动”。
但是文件名没有变化。
有了这个,您也可以为 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
根据引号改变参数的处理方式,字面量为"string"。
"usebackq"
新 更改启用其他资源的参数的处理方式。现在文字是 'string'.
tokens=1,2,3 delims=_." %%w
将 %%w 设置为第一个“_”分隔符之前的完整文件名。
并在扩展点后切断。
按照顺序 1:w before _, 2:x between _, 3:y between _ and .
('%%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"
我有一个工作文件夹。该文件夹中有多个子文件夹。每个子文件夹有 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
等等。
我需要做的就是
- 运行根目录下的脚本文件
- 让它重命名并反转根文件夹内所有子文件夹中所有图像的 Y 坐标顺序。
我对批处理脚本有非常基本的了解,所以我根据需要整理了以下代码,但它不会遍历子文件夹,再次使用时也不起作用。我究竟做错了什么?有人可以帮我解决这个问题吗?
@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) 第一 FOR LOOP
与 /R
& (*_*.png)
(ii) 第二 FOR LOOP
与 /R
& (*.png)
(iii) 第三 FOR LOOP
与 /R
& (*.png)
结果:完全没有变化。没有以任何方式重命名的文件。
场景02:
(i) 第一 FOR LOOP
与 /R
& (*_*.png)
(ii) 第二 FOR LOOP
与 /F
& ('dir /b *.png')
(iii) 第三 FOR LOOP
与 /F
& ('dir /b *.png')
结果:(i)“命令的语法不正确” (ii) “找不到文件”。 (iii)“找不到文件”。
场景 03:
(i) 第一 FOR LOOP
与 /R
& (*_*.png)
(ii) 第二 FOR LOOP
与 /F
& ('dir /b /s *.png')
(iii) 第三 FOR LOOP
与 /F
& ('dir /b /s *.png')
结果:(i)“命令的语法不正确” (ii) 对每个文件说“移动了 1 个文件”。 (iii) 对每个文件说“1 个文件已移动”。 但是文件名没有变化。
有了这个,您也可以为 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
根据引号改变参数的处理方式,字面量为"string"。
"usebackq"
新 更改启用其他资源的参数的处理方式。现在文字是 'string'.
tokens=1,2,3 delims=_." %%w
将 %%w 设置为第一个“_”分隔符之前的完整文件名。
并在扩展点后切断。
按照顺序 1:w before _, 2:x between _, 3:y between _ and .
('%%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"