2013-06-20 52 views
0

我有這樣的命令,通過目錄中的所有文件夾中去,並刪除所有的人,除了一個:批處理命令「列表中包含」操作

FOR /D %i IN ("Directory\*") DO IF /I NOT "%i" == "FolderToKeep" RD /S/Q "%i" 

現在我需要它來保持,而不是兩個特定的文件夾只有一個。起初,我認爲這只是爲了比較而添加一些簡單的OR邏輯,但似乎該批處理不支持像OR和AND這樣的邏輯運算符。那麼實現這個目標的最好方法是什麼?如果OR命令不存在,也許有可以讓你測試變量是否包含在列表中的功能?這樣的事情可能嗎?

FOR /D %i IN ("Directory\*") DO IF /I NOT "%i" IN "FolderToKeep","FolderToKeep2" RD /S/Q "%i" 

我不熟悉批處理編碼,所以請原諒,如果這看起來微不足道。

回答

5

方法Aacini嘗試:

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION 
SET "exclusion=\FolderToKeep\FolderToKeep2\" 
FOR /d %%i IN (directory\*) DO (
    IF /i "!exclusion:\%%~nxi\=!" equ "%exclusion%" RD /S/Q "%%~i" 
) 
+1

+1:很好但不是很明顯 – jeb

+1

@Endoro:你打了我幾分鐘! :-) – Aacini

+1

+1,但您應該使用'%〜NXi',因爲文件夾名稱可能包含擴展名。此外,如果文件夾名稱包含「=」,則該技術失敗。 – dbenham

5

具有嵌套IF小號

FOR /D %i IN ("Directory\*") DO (
    IF /I NOT "%i" == "FolderToKeep" (
     IF /I NOT "%i" == "FolderToKeep2" RD /S/Q "%i" 
    ) 
) 
+0

非常感謝!像魅力一樣工作。我恨批次:) –

+0

@KnutMarius - 你應該刷新你的布爾邏輯規則,它會幫助任何編程,而不僅僅是批處理。如果不是(a或b),你最初的問題等同於「如果不是a而不是b」,jeb的答案基本上是後者。 – dbenham

+0

我對邏輯規則有足夠的瞭解,以充分理解這一點,但我在批處理上或多或少是空白的,所以它比其他任何東西都更關注語法。我之所以將其標記爲答案,是因爲它解決了我的問題,這是我標記的唯一答案 –

5

「測試如果變量被包含在列表中」可以通過定義與所述列表中的變量可以容易地實現然後嘗試從列表中刪除特定值:如果列表更改,則該值位於列表中。此方法的唯一細節是將列表中的值與不能出現在值中的分隔符分開,並在刪除特定值時包含相同的分隔符。

另外,因爲此方法需要延遲擴展,所以不能在命令行中使用(除非以前啓用它)。

@echo off 
setlocal EnableDelayedExpansion 
set foldersToKeep=/FolderToKeep/FolderToKeep2/ 
FOR /D %%i IN ("Directory\*") DO (
    IF "!foldersToKeep:/%%~Ni/=!" equ "%foldersToKeep%" RD /S/Q "%%i" 
) 

通過的同時,在你的方法,你應該使用"%~Ni"得到公正的文件夾名稱,因爲由FOR返回名稱的列表包括:Directory\...部分,那就是,有沒有辦法,"Directory\FolderToKeep"等於"FolderToKeep"

+0

+1,但您應該使用'%〜NXi',因爲文件夾名稱可能包含擴展名。此外,如果文件夾名稱包含「=」,則該技術失敗。 – dbenham