2017-07-30 42 views
1

我正在做一個簡單的批處理腳本來處理一大組文件並刪除所有我不想要的。我想要的文件的10%左右,他們都有一定的標籤他們的名字,可以說它們含有appleorangepear。因爲有我想要刪除這麼多文件,這將是相當的時間來構建一個FOR循環如消費:如何使用FOR循環來處理不滿足條件的文件?

@echo off 
pause 
for /R %%i in ([the list of names of the files I don't want]) do del %%i 
pause 

所以我想知道是否有可能編寫它,使得它刪除所有文件它沒有包含appleorangepear名字?

換句話說,就是所有的文件將保留在其名稱中的3個字一個不包含。

我使用FOR循環,因爲這些文件是嵌套的很多子目錄中,我想保持這種結構不需要的文件已被刪除後。在命令行的結束del

@echo off 
for /F "delims=" %%I in ('dir * /A-D /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /R /V /C:"apple[^\\]*$" /C:"orange[^\\]*$" /C:"pear[^\\]*$"') do ECHO del "%%I" 

此批處理代碼並沒有真正刪除,因爲命令的文件ECHO

+0

如果排除字詞不存在於應該執行的路徑中:@For/F Delims =「%% B in('Dir/B/S/AD」X:\ start \ folder \ *「^| Findstr/RIV「蘋果橙香蕉」')做@Echo德爾「%%〜fB」'如果輸出看起來確定刪除回聲 – LotPings

回答

0

您可以使用包含此批處理文件(或多或少)只是一個命令行。在命令提示符窗口中運行此批處理文件,並且當前目錄是要刪除不需要的文件並驗證輸出的目錄樹的根目錄。然後刪除ECHO並再次運行該批處理文件。

命令DIR在當前目錄由於/S搜索和僅用於通配符模式*與由於/B這意味着輸出裸格式輸出匹配由於/A-D(未目錄屬性)文件的所有子目錄僅僅包含所有找到的具有完整路徑的文件的名稱。

DIR輸出錯誤信息處理STDERR如果找不到任何文件。此錯誤消息是由它與2>nul重定向到設備NUL抑制。重定向操作>必須在這裏與插入符號^轉義首先被解釋爲文字字符的解析由Windows命令解釋器FOR命令行。

DIR的輸出來處理STDOUT通過管道與|標準控制檯應用程序FINDSTR其搜索在所有行的情況下不敏感,因爲/I用於與/C:指定因爲/R正則表達式的字符串。重定向運算符|也必須在^之間轉義。

FINDSTR不支持OR表達式,它支持正則表達式。但是可以指定多個搜索字符串,這些字符串全部應用於文本的每一行,以便一個接一個地處理,直到出現正匹配或者沒有更多搜索字符串。這是一個經典的OR。

正則表達式word[^\\]*$手段:

  • word ...必須有發現word(不區分大小寫)。
  • [^\\]* ...查找0個或多個字符不是反斜線。
  • $ ...必須在行末找到匹配字符串。

正則表達式來獲得一個正匹配僅適用於該文件名包含任何appleorangepear,但不是文件路徑線。

但還有一個FINDSTR選項:/V。該選項將結果輸出反轉以處理STDOUT。所以輸出是3個正則表達式中的產生正匹配的行。

命令FOR處理由FINDSTR每條輸出線用作用於輸出DIR負過濾器和用於每個運行行的命令DEL分別ECHO不分割線成空間/標籤由於delims=而分隔的字符串。

就是這樣。

如果存儲在由命令DIR處理的目錄樹中,需要防止刪除批處理文件。通過在批處理文件中設置只讀屬性,可以非常容易地實現該操作,如命令DEL不會刪除只讀屬性設置的文件。

實施例:

@echo off 
rem Prevent batch file from deletion by setting read-only attribute on batch file. 
%SystemRoot%\System32\attrib.exe +r "%~f0" 

for /F "delims=" %%I in ('dir * /A-D /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /R /V /C:"apple[^\\]*$" /C:"orange[^\\]*$" /C:"pear[^\\]*$"') do del "%%I" 

rem It is safe to remove read-only attribute from batch file. 
%SystemRoot%\System32\attrib.exe -r "%~f0" 

上面的批量代碼沒有ECHO命令del之前並且因此真正刪除上執行的文件。

爲了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀爲每個命令顯示的所有幫助頁面。

  • attrib /?
  • del /?
  • dir /?
  • echo /?
  • findstr /?
  • for /?
  • rem /?

另請參閱Microsoft有關Using Command Redirection Operators的文章,以獲得對|2>nul的解釋。

相關問題