2009-11-18 147 views
1

用於刪除文件,我將使用下面的代碼刪除目錄中最舊的文件並每天運行它。它來自我的question批處理腳本問題

應用到原來的批處理腳本:

SET BACKUPDIR=C:\PATH\TO\BACKUPS 
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i 
DEL %BACKUPDIR%\%OLDEST% 

東西如檢查,如果該文件量是21,如果是的話刪除最近的一次:

SET BACKUPDIR=C:\test 
SET countfiles = dir BACKUPDIR /b | find /v /c "::" 

if countfiles > 21 
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i 
DEL %BACKUPDIR%\%OLDEST% 

編輯:對不起,我忘了問題,我的嘗試失敗了,我會很樂意以任何方式指導如何使其工作。

+0

你的問題是什麼? – 2009-11-18 14:11:07

+0

我不確定你的問題 – 2009-11-18 14:11:40

+0

對不起,請檢查編輯:) – Hellnar 2009-11-18 14:14:32

回答

1

第一,似乎set不像變量和=符號之間的空格:如果您放置空格,變量名稱將包含空格。所以你必須刪除空間來正確定義變量名稱。

此外,將命令的輸出捕獲到變量中的語法是錯誤的。我知道的唯一方法(拼命搜索stackoverflow後的答案)是使用for循環技巧來使用臨時變量(有關更多詳細信息,請參閱this question)。實際上,您還需要轉義管道才能正確解析命令。

然後,當在if表達式中測試的變量不存在時,結果總是爲真,因此請確保該變量存在。通過如上所述去除空格,if表達式中的名稱將與您的變量名稱匹配,並且測試將正確執行。

然後你忘了圍繞最後2個命令做一個塊。實際上,如果您有超過21個文件並計算最早的文件(如果它是真的),那麼您正在測試,然後您總是刪除最老的文件。

此外,大於運營商>可被理解爲重定向。您可能需要使用GTR操作員。

SET BACKUPDIR=C:\test 
FOR /F %%i in ('dir BACKUPDIR /b ^| find /v /c "::"') DO SET countfiles=%%i 

if countfiles GTR 21 (
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i 
DEL %BACKUPDIR%\%OLDEST% 
) 
+0

非常感謝這個建議,但是它的升級很奇怪,現在它不在乎countfiles是大於還是小於21,無論如何刪除了一個文件:S – Hellnar 2009-11-18 14:33:41

+0

我在'set'命令中添加了更多關於空格的信息這可能有助於解決問題。 – 2009-11-18 14:53:31

+0

現在我糾正了你的變量設置的方式... – 2009-11-18 16:25:24

0

這不工作......你不能在for循環中設置'正常'變量。前幾天我遇到了同樣的問題,並用this blog entry解決了這個問題。

基本上,你需要設置SETLOCAL ENABLEDELAYEDEXPANSION然後用!代替% ...

set FILES= 
for /f %%a IN (‘dir /b *.txt’) do set FILES=!FILES! %%a 
echo %FILES% 

所以,這應該爲你工作:

SETLOCAL ENABLEDELAYEDEXPANSION 
SET OLDEST= 
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i 
DEL %BACKUPDIR%\%OLDEST% 
+0

實際上我提到的第一個腳本對我來說工作的很好。歡呼聲 – Hellnar 2009-11-18 14:22:34

+0

@Hellnar,哦對不起......好像我完全誤解了你。 *尷尬* – Bobby 2009-11-18 14:48:23