batch-file - 如何使用批处理脚本重命名具有多个条件的不同子目录中的 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) 1st FOR LOOP
with /R
& (*_*.png)
(ii) 2nd FOR LOOP
with /R
& (*.png)
(iii) 3rd FOR LOOP
with /R
&(*.png)
结果:完全没有变化。没有以任何方式重命名的文件。
场景 02:(i) 1st FOR LOOP
with /R
& (*_*.png)
(ii) 2nd FOR LOOP
with /F
& ('dir /b *.png')
(iii) 3rd FOR LOOP
with /F
&('dir /b *.png')
结果:(i)“命令的语法不正确”(ii)“找不到文件”。(iii) “找不到文件”。
场景 03:(i) 1st FOR LOOP
with /R
& (*_*.png)
(ii) 2nd FOR LOOP
with /F
& ('dir /b /s *.png')
(iii) 3rd FOR LOOP
with /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
根据引号改变参数的处理方式,字面量为“字符串”。
"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"
推荐阅读
- spring-boot - 在这个用例中需要关闭流吗?
- webhooks - 发布到目标的消息卡从团队输入返回空白
- php - 如何更新 laravel 控制器中的数组?
- java - Spring如何在@Controller生成的json中保留所有子实体的实体ID?
- python - 如何在行为python中更改场景的状态
- python - 从 Python 脚本调用 Julia 脚本时减少加载时间的方法?
- python - CoGroupByKey,在 n 条记录被分组后发出
- python - train_test_split:ValueError
- terraform - 以编程方式检测 Terraform 输入和/或输出变量
- angular - Angular 库推送以加载导出成员的所有模块