2009-07-27 28 views
1

我想寫一個小的批處理腳本,將從目錄中刪除文件的舊文件。 第一個參數是腳本查看的目錄,第二個參數是要保留的文件數量。批腳本,對於使用目錄的結果

rem @ECHO OFF 

rem %1 is the path in which to look for the files 
rem %2 is the number of recent files to preserve 

if [%1] EQU [] (
    echo ERROR: Missing Required Paramater directory path. 
    goto :eof 
) 

if [%2] EQU [] (
    echo ERROR: Missing Required Paramater, number of files to preserve 
    goto :eof 
) 

if %2 LSS 0 (
    echo ERROR: Number of files to preserve provided was negative 
    goto :eof 
) 

set FolderPath=%1 
set SafeNumber=%2 

cd %FolderPath% 

for /f %%f in ('dir /O-D /A-D /B') do call :delete %%f 
goto :eof 

:delete 
if %SafeNumber% LEQ 0 (
    del %1 
) else (
    set /a SafeNumber-=1 
) 
goto :eof 

:eof 

基本上我在這裏是一個dir,輸出從最新到最舊的排序文件名列表。根據SafeNumber是什麼,它會跳過前幾個文件,然後進行刪除一次SafeNumber < = 0.

現在的問題是,如果文件名是「Test File.txt」(as in「包含空格,」Test「作爲%1傳入刪除,而不是」Test File.txt「。

關於如何讓我的腳本工作,或者有人有更好的書面解決方案的任何想法?

回答

2

您是否曾嘗試在您的輸入文件名稱或腳本中放置引號?我的意思是圍繞%f或%1作爲腳本。

+0

改變for語句是: 在('DIR/OD/AD/B/F 「delims =」 %%˚F %FolderPath%')do call:刪除「%% f」 現在刪除獲取完整的文件名。語錄幫助了一大堆,沒有想到這個謝謝。 – 2009-07-27 21:44:34

0

要處理文件名中的空格等。你會想引用文件名和路徑「%1」等....也許這是你唯一的問題。

0

您將不得不將find命令與-newer然後使用-exec rm一起使用。例如,要刪除所有文件比file.txt的做更新:

find . -type f -newer file.txt -exec rm {} \; 
+1

他問一個關於DOS/Win批處理文件的問題,而不是Unix shell! – 2009-07-27 21:01:34

0

很久以前,我寫的是應該從控制檯,即從一個批處理文件啓動一個簡單的Java編。 prog將從指定的目錄中刪除舊文件。查看here,我其實不記得它的工作原理,但我建議先在測試文件夾中使用它。它應該用於Windows,至少在那裏它是我使用它的地方。

我現在切換到Mac上,在那裏我用下面的Automator腳本,我在每次啓動時啓動那份工作:

find /Users/<yourUser>/Downloads/* -type f -mtime +90 -exec mv -f {} /Users/<yourUser>/.Trash \; 
0

更改您的for循環,並與您的刪除功能做了。

for /f "skip=%safenum%" %%f in ('dir /o-d /a-d /b') do (del %%f) 

我的for循環不健康的愛情......