2013-09-30 68 views
2

我有一個包含多個包含數千個jpgs的子目錄的目錄。我想要做的是創建一個批處理腳本,將通過所有的子目錄和刪除每個第二個圖像即保留第一,第三,第五個圖像,但刪除第二,第四和第六圖像等每個目錄(按文件名)。批處理腳本刪除目錄中的每個其他文件

我嘗試了以下,但我的批處理腳本知識很差,並且語法顯然不正確。

@echo off 
set z = 0 
for /f %%a in ('dir/b *.jpg') 
do (
    set z = z + 1 
    if z == 2 del %%a 
) 

回答

3
  • 的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" 
) 
+0

隨着DIR/B我認爲這將只處理當前目錄。如果我使用dir/b/s並以root運行,它會從所有子文件夾中刪除第二個等圖像。 – user2832776

+0

@ user2832776 - 是的。我讓自己受到原始代碼的影響。現在全部修好了。 FOR/R遍歷目錄樹,併爲每個目錄重置刪除「標誌」。 – dbenham

+0

+1 Nice'set' !!!錯過了'1 /(!z!%% 2)'? –

1

試試這個,取出echo如果輸出看起來不錯:

@echo off &setlocal 
for /f "tokens=1*delims=:" %%a in ('dir /b /s /a-d *.jpg^|findstr /n $') do (
    echo %%a|findstr "[02468]$" >nul && echo del "%%~b" 
) 
+0

+1 Nice腳本,但不會爲每個子目錄重置計數器。 –

+0

@LS_dev顯然不是。這不是必需的。這也沒有意義,imo。 :) – Endoro

+0

如果有20個或更多的文件,這將給出錯誤的結果。順便說一句 - 我認爲整個任務沒有任何意義。但是,如果爲每個文件夾重置計數,則會有顯着差異。如果不重置,那麼以1個文件開頭的文件夾最終可能沒有文件,因此無法與以無文件開頭的文件夾區分。如果重置每個文件夾,那麼每個以至少一個文件開始的文件夾將至少包含一個文件。缺點是如果每個文件夾只有一個文件,那麼沒有文件被刪除:) – dbenham

相關問題