的DO必須在同一行FOR。目前,它只會刪除第二個文件,而不是每隔一個 -
,如果你想要做的數學
你的邏輯是錯誤的,必須使用SET/A。如果結果爲0,則應採用mod 2值(餘數除以2)並刪除。
如果要查看當前值(除SET/A語句之外),則必須使用%z%
。但是,這不會在只設置值的代碼塊內工作。在這種情況下,您需要啓用延遲擴展並改爲使用!z!
。
在啓用延遲展開的情況下,展開包含!
(在文件名中有效)的FOR變量將損壞該值。所以延遲擴展必須打開和關閉
你說你想遞歸子目錄,但你的代碼只看一個文件夾。
空間在SET語句中很重要。您的代碼在名稱的末尾定義了一個變量z
,並帶有一個空格。不是你想要的。
這裏是一個調試版本:
@echo off
setlocal
for /r %%D in (.) do (
set "z=0"
for /f %%F in ('dir /b "%%D\*.jpg"') do (
set /a "z+=1, r=z%%2"
setlocal enableDelayedExpansion
if !r! equ 0 del "%%D\%%F"
endlocal
)
)
有辦法解決這個問題,而不延遲擴展。一種是簡單地在定義和取消定義一個變量之間交替。
@echo off
setlocal
for /r %%D in (.) do (
set "del="
for /f %%F in ('dir /b "%%D\*.jpg"') do if defined del (
del "%%D\%%F"
set "del="
) else set "del=1"
)
另一種是當你想刪除時有意除以0,只有在出現錯誤時才刪除。錯誤消息被2>nul
隱藏,並且||
運算符僅在先前命令失敗時纔有條件地執行以下命令。
@echo off
setlocal
for /r %%D in (.) do (
set "z=0"
for /f %%F in ('dir /b "%%D\*.jpg"') do 2>nul set /a "z+=1, 1/(z%%2)" || del "%%D\%%F"
)
隨着DIR/B我認爲這將只處理當前目錄。如果我使用dir/b/s並以root運行,它會從所有子文件夾中刪除第二個等圖像。 – user2832776
@ user2832776 - 是的。我讓自己受到原始代碼的影響。現在全部修好了。 FOR/R遍歷目錄樹,併爲每個目錄重置刪除「標誌」。 – dbenham
+1 Nice'set' !!!錯過了'1 /(!z!%% 2)'? –