我有一個作業檔案夾。在該檔案夾中有多個子檔案夾。每個子檔案夾有 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) 第 1 次FOR LOOP與/R& (*_*.png)
(ii) 第二次FOR LOOP與/R& (*.png)
(iii) 第三次FOR LOOP與/R&(*.png)
結果:完全沒有變化。沒有以任何方式重命名的檔案。
場景 02:(i) 第 1 次FOR LOOP與/R& (*_*.png)
(ii) 第二次FOR LOOP與/F& ('dir /b *.png')
(iii) 第三次FOR LOOP與/F&('dir /b *.png')
結果:(i)“命令的語法不正確”(ii)“找不到檔案”。(iii) “未找到檔案”。
場景 03:(i) 第 1 次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 個檔案已移動”。但檔案名沒有變化。
uj5u.com熱心網友回復:
有了這個,您也可以為 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”檔案和 SYMLINK。
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"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312622.html
下一篇:一行中的for回圈輸出
