的DELIMS選項指定的字符,而不是字符串列表。因此,您的FOR循環將分割標記'
或_
或b
或y
。另外,您無法知道最後一個令牌的數字是多少。你的設計是一個死路一條。
選項1
這是一個純粹的批量解決方案,將你想要做什麼。我使用替換將文件名轉換爲僞路徑。然後輕鬆選取所需的名稱。延遲擴展用於訪問設置它的同一個循環(代碼塊)內的變量值。唯一棘手的部分是根據需要打開和關閉延遲擴展,以保留任何!
。如果包含!
字符的FOR變量在擴展時啓用延遲擴展,則它將被損壞。
@echo off
setlocal disableDelayedExpansion
for %%F in (*_by_*.jpg) do (
%= Initialize name without extension =%
set "name=%%~nF"
%= Convert "Part1_by_Part2_by_Name" into "Part1\Part2\Name" =%
setlocal enableDelayedExpansion
for %%f in ("!name: - =\!") do (
%= Only execute endlocal on the first iteration =%
if "!!" equ "" endlocal
%= The name might contain a dot, so need name and extension =%
set "name=%%~nxf"
)
set "file=%%F"
setlocal enableDelayedExpansion
%= Hide error message if folder already exists =%
md "!name!" 2>nul
move "!file!" "!name!"
endlocal
)
選項2
的邏輯是簡單的,如果使用的子程序,因爲它避免了延遲擴展的問題。 CALL使代碼效率較低(較慢),但這不應該成爲這樣的任務的問題。
@echo off
setlocal disableDelayedExpansion
for %%F in (*_by_*.jpg) do call :moveFile "%%F"
exit /b
:moveFile
set "name=%~n1"
for %%F in ("%name:_by_=\%") do set "name=%%~nxF"
md "%name%" 2>nul
move %1 "%name%"
exit /b
選項3
最簡單的解決方案是使用我的JREPL.BAT utility - 混合的JScript /批執行正則表達式置換腳本。 JREPL是純粹的腳本,可以在任何Windows XP機器上運行。
@echo off
for /f "tokens=1,2 delims=: eol=:" %%A in (
'dir /b /a-d *_by_*.jpg ^| jrepl "^.*_by_(.*)\.jpg" "$&:$1" /i'
) do (
md "%%B" 2>nul
move "%%A" "%%B"
)