2009-11-23 44 views
0

在一個文件夾內(如c:\ test)我想刪除最舊的文件,如果文件數超過21個。如何讓我的批處理腳本可以刪除舊文件?

這是我想出的問題是它一次刪除最舊的文件,第二次運行它什麼也不做,並刪除最老的第三,繼續這樣。也不關心文件數量是否低於21,即使更低也會刪除。

下面是代碼:

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

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

我會嘗試你這個調試自己,但怎麼樣我只是告訴你我會怎麼做。首先,堅持一些回聲陳述。在前兩個'SET'語句之後添加一行'echo countfiles =%countfiles%'和'echo BACKUPDIR =%BACKUPDIR%'。然後在'IF'語句中添加一行,如'echo countfiles> 21>。簡單的調試技術可能會讓您自己發現故障。 – 2009-11-23 00:18:39

+0

@PP:我thik這將是一個很好的答案或至少一個很好的指針:) – 2009-11-23 00:23:50

回答

1

這裏是在VBScript中的另類,,遍歷該目錄只有一次。

Set objFS=CreateObject("Scripting.FileSystemObject") 
Set objArgs = WScript.Arguments 
strFolder = objArgs(0) 
strScriptName = WScript.ScriptFullName 'get script name 
Set objFolder = objFS.GetFolder(strFolder) 
Set dict = CreateObject("Scripting.Dictionary") 
current = Now 
temp=0 
count=0 'count files 
For Each strFile In objFolder.Files 
    If strFile.Path <> strScriptName Then 'do if not script name 
     count=count+1 
     dict.Add strFile.Path, strFile.DateLastModified 
     'if there are more than 21 files 
     If count >= 21 Then 
     flag=1 
     End If 
    End If 
Next 

filedate = dict.Items 
filename = dict.keys 
If flag = 1 Then 
    For i = 0 To dict.Count -1 'iterate dictionary 
     diffdate = DateDiff("d",filedate(i),now) 
     If num_days_diff >= temp Then 
     oldestfile = filename(i) 
     oldestdate = filedate(i) 
     temp = num_days_diff 
     End If    
    Next 
End If 
Set dict=Nothing 
WScript.Echo "Oldest file: " & oldestfile, oldestdate 
objFS.DeleteFile(oldestfile) 

另存爲deletefile.vbs和命令行

c:\test> cscript /nologo deletefile.vbs c:\path\somewhere 
+0

非常感謝輸入,但是我在此看到一個問題,除非將它放到「C:\ test」,否則它不起作用。如果我在「C:\ test」下運行它,它會自行刪除:)我對vbscripting非常陌生,它怎麼能從遠程目錄運行它(即從「C:\」執行它。乾杯 – Hellnar 2009-11-23 08:58:01

+1

你可以使用參數我已編輯過包含參數你是什麼意思刪除「本身?」 – ghostdog74 2009-11-23 09:37:21

+0

它只在將它放到文件目錄時才起作用,並且由於腳本本身就是一個文件,它正在刪除腳本文件:) – Hellnar 2009-11-23 14:05:11

4

有許多與此問題。

  1. 環境變量與文本字符串:

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

    在這裏,我們試圖在一個名爲「BACKUPDIR」目錄中列出的文件,而不是使用環境變量。它應該是

    SET countfiles=dir %BACKUPDIR% /b | find /v /c "::" 
    
  2. 你獲得的文件數量的嘗試:

    SET countfiles=dir %BACKUPDIR% /b | find /v /c "::" 
    

    不可能工作。這只是將字符串'dir BACKUPDIR /b | find /v /c "::" '分配給環境變量countfiles。它不會運行任何東西 - cmd應該如何知道這是一個要執行的命令?

    你想要的是以下幾點:

    for /f %%x in ('dir %BACKUPDIR% /b ^| find /v /c "::"') do set countfiles=%%x 
    

    這將countfiles環境變量的內容設置爲上述命令的輸出。您可以通過help for找到更多相關信息。

  3. 您的比較:

    if countfiles GTR 21 
    

    這個比較"countfiles"和字符串"21"。並且由於countfiles21之後得到排序,所以此情況將始終爲真。

    你想使用環境變量%countfiles%這裏:

    if %countfiles% GTR 21 
    
  4. 你試試「正常」,「塊」中的變量擴展:

    ​​

    由於cmd在解析時立即展開環境變量一個命令會導致問題。請注意,上面的塊作爲cmd的單個命令。完整的程序塊在運行前會被解析,並且所有的變量在運行時都會被替換掉,所以這不是正確的方法來處理那些可能會改變這個塊的變量

    這裏的解決方案是延遲擴展。您可以包括您的批處理開始下面一行:

    ​​

    而是採用可變像%OLDEST%您使用!OLDEST!和。 !也擴展了變量,但是在執行之前直接執行,而不是在解析時執行。所以,你的代碼段會成爲:

    if %countfiles% GTR 21 (
        FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i 
        DEL %BACKUPDIR%\!OLDEST! 
    ) 
    
  5. 萬一你期待與空格的文件名時,for /f循環中的最後一塊沒有達到預期效果。你可以修改它是這樣的:

    for /f "delims=" %%i in ... 
    

    這確保了線不破的空間(你會得到公正的第一個標記,到第一個空格的文件的名稱,而不是完整的文件。名字

所以,總結,你的程序可能看起來像下面這樣:

SET BACKUPDIR=C:\test 
for /f %%x in ('dir %BACKUPDIR% /b ^| find /v /c "::"') do set countfiles=%%x 

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

,並應大致工作,我沒有測試過它(牀話費)每一個方面,但我。確信它有效比以前更好,我希望你能理解上面的修正和爲什麼它們是必要的。

順便說一句:find /v /c "::"是一個漂亮的小動作。不知道那一個或想到它。

以防萬一:如果您確實想繼續刪除最舊的文件,直到您的文件數降至21以下,那麼該單一的if將不會削減它。您需要設置一個循環,要麼繼續迭代並重新計算每次迭代,要麼計算需要刪除的文件數量。儘管如此,我將把它作爲一個練習。 (提示:循環可以有標籤和條件goto S或使用for /l完成後者需要更多的延遲擴展,雖然,所以要小心。)

+0

非常感謝輸入Johannes,特別是向我展示我的錯誤,因爲我更傾向於使用Linux(所以bash腳本),這是一個有趣的經驗。同時你建議的代碼不起作用。以下是可能解釋所有內容的屏幕截圖:):http://img692.imageshack.us/img692/2199/deletex.jpg 致以問候 – Hellnar 2009-11-23 09:08:57

+1

呃,我非常抱歉,我錯過了那一個。你應該在''''''''''dir'命令中加入'BACKUPDIR'命令:'dir%BACKUPDIR%/ b'來起訴環境變量,而不是嘗試找到一個名爲「BACKUPDIR」的目錄。 – Joey 2009-11-23 10:03:39

+1

好的,編輯了更改。希望我沒有忘記一個實例。 – Joey 2009-11-23 10:05:35

相關問題