2016-04-02 3 views
0

Ich habe derzeit dieses VBScript, das die Größe eines Ordners überprüft, löscht dann Dateien (älteste zuerst), bis ein Schwellenwert erreicht ist.Ändern Sie ein Skript, um verbleibenden Speicherplatz eines Laufwerks zu überprüfen

Option Explicit 
'use next line for production 
On Error Resume Next 
'use next line for debugging 
'On Error GoTo 0 

Dim strResult: strResult = Wscript.ScriptName 
Dim objFSO, strOldestFile, dtmOldestDate, strFolder, oFolder, intFolderSize 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
dtmOldestDate = Now 
strFolder  = "C:\Users\PLEX\Downloads\Torrent\" 
strOldestFile = "" 
Set oFolder = objFSO.GetFolder(strFolder) 

intFolderSize = Int(((oFolder.Size/1024)/1024)/1024) 

Do While intFolderSize >= 110 
    strOldestFile = "" 
    dtmOldestDate = Now 

    FindOldestFile oFolder 

    'WScript.Echo strOldestFile 
    objFSO.DeleteFile strOldestFile, True 
    strResult = strResult & vbNewLine & dtmOldestDate & vbTab & strOldestFile 

    intFolderSize = Int(((oFolder.Size/1024)/1024)/1024) 
Loop 

'WScript.Echo strResult 
WScript.Quit 

Sub FindOldestFile(objFolder) 
    Dim objFile, colFiles, colFolders, strFile, dtmFileDate 
    'find oldest file 
    Set colFiles = objFolder.Files 
    For Each objFile In colFiles 
    strFile = objFile.Path 
    dtmFileDate = objFile.DateCreated 
    If dtmFileDate < dtmOldestDate Then 
     dtmOldestDate = dtmFileDate 
     strOldestFile = strFile 
    End If 
    Next 
    'recurse subfolders 
    Set colFolders = objFolder.SubFolders 
    For Each objFile In colFolders 
    FindOldestFile objFile 
    Next 
End Sub 

Derzeit dieses Skript wird:

  1. Überprüfen Sie die Kapazität des Ordners A einschließlich aller Unterordner.
  2. Löschen von Dateien (älteste zuerst) aus dem Ordner A und Unterordner, bis eine Schwelle (in diesem Fall, 110GB)

erreichte Ich möchte das Skript ändern, dies zu tun:

  1. Überprüfen Sie die Kapazität von Ordner A einschließlich aller Unterordner.
  2. Löschen Sie Dateien (älteste zuerst) aus Ordner B (der ein Unterordner von Ordner A ist) und Unterordner, bis ein Schwellenwert erreicht ist.

Zum Beispiel ist es möglich, dieses Skript erhält die verwendete Kapazität des gesamten C zu überprüfen: Laufwerk und löschen Sie die ältesten Dateien aus C:\Users\PLEX\Downloads\Torrent\, wenn es weniger als 5% auf C verbleibende :?


Edit: Ich hatte schon vollen Zugang und fixiert den Fehler durch C:\-C: ändern. Ich änderte auch C:\Users\PLEX\Desktop\New Folder zu \Users\PLEX\Desktop\New Folder und bekomme jetzt keine Fehler. Das einzige Problem ist, dass IntFolderSize immer noch die Größe meines Unterordners zeigt, nicht die Wurzel. Ich habe das unter Verwendung von Wscript.Echo intfoldersize bestätigt. Mein aktuelles Skript ist unten. Wie kann ich IntFolderSize erhalten, um die verwendete Größe der Wurzel anzuzeigen?

option explicit 
'use next line for production 
'On Error Resume Next 
'use next line for debugging 
'On Error GoTo 0 

Dim strResult: strResult = Wscript.ScriptName 
Dim objFSO, strOldestFile, dtmOldestDate, strFolder, oFolder, intFolderSize 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
    dtmOldestDate = Now 
    strFolder = "C:" 
    strOldestFile = "" 
Set oFolder = objFSO.GetFolder(strFolder) 

intFolderSize = Int(((oFolder.Size/1024)/1024)/1024) 

Wscript.Echo intfoldersize 

Do While intFolderSize >= 70 
    strOldestFile = "" 
    dtmOldestDate = Now 

FindOldestFile objFSO.GetFolder(objFSO.BuildPath(strFolder,"\Users\PLEX\Desktop\New Folder\")) 

'wscript.echo strOldestFile 
    objFSO.DeleteFile strOldestFile, True 
    strResult = strResult & vbNewLine & dtmOldestDate & vbTab & strOldestFile 

    intFolderSize = Int(((oFolder.Size/1024)/1024)/1024) 

Loop 

'Wscript.Echo strResult 
Wscript.Quit 

Sub FindOldestFile(objFolder) 
    Dim objFile, colFiles, colFolders, strFile, dtmFileDate 
    ' find oldest file 
    Set colFiles = objFolder.Files 
    For Each objFile in colFiles 
    strFile = objFile.Path 
    dtmFileDate = objFile.DateCreated 
    If dtmFileDate < dtmOldestDate Then 
     dtmOldestDate = dtmFileDate 
     strOldestFile = strFile 
    End If 
    Next 
    ' recurse subfolders 
    Set colFolders = objFolder.SubFolders 
    For Each objFile in colFolders 
    FindOldestFile objFile 
    Next 
End Sub 

Antwort

0

ändern

FindOldestFile oFolder 

in

FindOldestFile objFSO.GetFolder(objFSO.BuildPath(strFolder, "sub\folder")) 

wo strFolder Ihr Stammordner und "sub\folder" der relative Pfad zum Unterordner unter diesem Stammordner.


Edit: Beachten Sie, dass die oFolder.Size Eigenschaft einen Fehler angehoben werden, wenn Sie den Zugriff auf jede einzelne Datei und Ordner unter oFolder haben. Wenn Sie die freie Speicherplatz auf dem Datenträger ohnehin überprüfen möchten, können Sie besser dran sein WMI für das und mit oFolder ausschließlich für den Ordner, den Sie löschen möchten aus:

strFolder = "C:\Users\PLEX\Desktop\New folder" 
Set oFolder = objFSO.GetFolder(strFolder) 

threshold = ... 'desired minimum free diskspace in byte 

Set wmi = GetObject("winmgmts://./root/cimv2") 
qry = "SELECT * FROM Win32_Volume WHERE DriveLetter='C:'" 

Do While wmi.ExecQuery(qry).ItemIndex(0).FreeSpace < threshold 
    ... 
    FindOldestFile oFolder 
    ... 
Loop 
+0

[Dies ist, was mein Skript jetzt aussieht .] (http://pastebin.com/AGQ3mmgS) Ich bekomme einen Zugriff verweigert Zugriff auf Zeile 16 'intFolderSize = Int (((OFolder.Size/1024)/1024)/1024)'. Irgendeine Idee, wie man das repariert? – Cameron

+0

'" sub \ folder "' muss relativ zum Stammordner sein, kein absoluter Pfad, und Sie müssen vollen Zugriff auf alles unter dem Stammordner haben, damit '.Size' funktioniert. –

+0

Ich hatte bereits vollen Zugriff und behob den Fehler, indem ich 'C: \' zu 'C:' änderte.Ich habe auch "C: \ Benutzer \ PLEX \ Desktop \ Neuer Ordner" in "\ Benutzer \ PLEX \ Desktop \ Neuer Ordner" geändert und erhalte jetzt keine Fehler. Das einzige Problem ist, dass "IntFolderSize" immer noch die Größe meines Unterordners anzeigt, nicht das der Wurzel. Ich habe das mit 'Wscript.Echo intfoldersize' bestätigt. [Mein aktuelles Skript kann hier gefunden werden.] (Http://pastebin.com/NbeWu1g) Wie kann ich 'IntFolderSize' bekommen, um die verwendete Größe der Wurzel anzuzeigen? – Cameron

Verwandte Themen