Avatar billede jnoval Nybegynder
16. december 2004 - 09:19 Der er 11 kommentarer og
1 løsning

Script der sletter filer der er over x dage gamle

Jeg har en masse log filer som et program genererer. Den vil jeg gerne have slettet når de er over x dage gamle. Hvordan gør man det. Jeg er meget åben for løsningsforslag. Det kan f.eks. være VBA, bat eller et lille freeware program der kan klare det.
Avatar billede Slettet bruger
16. december 2004 - 09:43 #1
Det kan gøres med en enkelt linje i en .bat fil.

Hvad hedder de filer som skal slettes ??? , eller bare filendeliser ???
Avatar billede Slettet bruger
16. december 2004 - 09:44 #2
.... og hvor er de placeret ???
Avatar billede majsmarken Nybegynder
16. december 2004 - 09:57 #3
Her er den jo:
http://www.eksperten.dk/spm/393648

Indbyg den i en *.CMD fil som startes automatisk via [Kontrolpanel][Planlagte opgaver]. Sådan bruger jeg det - virker fint !!!
Avatar billede Slettet bruger
16. december 2004 - 10:05 #4
Eller med denne linje i en .bat fil:
For /F "Tokens=* Skip=7" %%F In ('dir *.log /O-D /A-D /B') Do Del "%%F"

Kræver at .bat filen ligger i samme mappe, som filer der skal slettes.
Den vil slette alle .log filer.
Avatar billede jnoval Nybegynder
16. december 2004 - 12:16 #5
Der er flere forskellige extensions på filerne. f.eks. .ok .error .log .rep .resubmit, men de kan også være filer med flere ekstemsions. F.eks.: b78.tmp.error
Vi kan jo sige at mappen hedder: c:\folder\log
Hvis det er besværligt med alle de forskellige extensions, så kunne det evt. være alle filer i mappen. bat-filen må ikke ligge i samme mappe, da jeg har alle scripts i en scripts mappe.
Avatar billede majsmarken Nybegynder
16. december 2004 - 12:36 #6
I mit forslag (se 16/12-2004 09:57:24) kan dog kun én extension vælges ad gangen. Så er det bare et spm. om at rulle programmet flere gange med forskellig extensions valg?
Jeg bruger det til bla. at automatisk slette diverse grafikfiler ældre end seks døgn fra en specific server/path. Så i CMD filen køres programmet fire omgange med henholdsvis *.BMP *.JPG *.TIF *.GIF valgt. Startes automatisk via [Kontrolpanel][Planlagte opgaver] til at rulle hver nat kl 02:00. Overstået på få sekunder.
Avatar billede jnoval Nybegynder
16. december 2004 - 12:54 #7
majsmark. Jeg er ikke helt med på hvilken af løsningerne i http://www.eksperten.dk/spm/393648 som det er du anbefaler. Tråden henviser til en ny tråd. Er det det mega script fra http://cwashington.netreach.net/depo/view.asp?Index=723&ScriptType=vbscript
Avatar billede majsmarken Nybegynder
16. december 2004 - 13:20 #8
Det er den lettere tilrettet fra den oprindelige fra http://cwashington.netreach.net/depo/view.asp?Index=723&ScriptType=vbscript
Den oprindelige var baseret på DAYS og tog alle filtyper i valgte PATH.
Avatar billede majsmarken Nybegynder
16. december 2004 - 13:20 #9
'~~[comment]~~
' PURGEFILES.vbs uses the LastModifiedDate*24 of a file
' and deletes it if it is older that the specified number of hours.
' Supports command line arguments.
'~~[/comment]~~
'
'~~[script]~~
'==========================================================================
'
' COMMENT:PURGEFILES.vbs uses the LastModifiedDate*24 of a file and deletes it
'    if it is older that the specified number of hours.
'
' USAGE:    CScript.exe purgefiles.vbs <rootfolder\*.filetype> <maxhoursold> [/R] [/S] [/T] [/V] [/L:logfile] [/E]
'
' <rootfolder> - Specifies the directory to start purging files.
' <maxhoursold> - Specifies how old a file can be in Days before it is purged.
' [/E] - Report status and results to the Event Log.
' [/L:logfile] - Specifies a file to output the results to.
' [/R] - Deletes the rootfolder if it is empty.
' [/S] - Deletes any empty subdirectories.
' [/T] - Test Mode - does not delete any files or directories.
' [/V] - Verbose Mode - shows detailed information to the screen.
' /? - Displays USAGE message.
'
'==========================================================================
'Revision History:
'
'v2.1 - 11 Oct. 2003
'Possible to define filetype on cmd line eg. E:\*.qzx  and  E:\grap\*.qzx
'
'v2.0 - 13 Sep. 2003
'Changed to use number of HOURS instead of DAYS
'
'v1.2.1 - 11/06/02
'*Fixed* Script would not write anything to the logfile unless it was in TestMode.
'*Fixed* Potential problem that could delete the logfile if 0 maxhoursold was used.
'
'v1.2 - 11/04/02
'*Added* [/L] - LogFile option.
'*Added* [/E] - Event Log option.
'*Added* [/V] - Verbose Mode option.
'*Added* [/T] - Test Mode option.
'
'v1.1 - 11/01/02
'*Added* [/R] - bDeleteRoot option.
'*Added* [/S] - bDeleteSub option.
'
'v1.0 - 10/31/02
'Initial Release.
'
'==========================================================================

Const EVENT_SUCCESS = 0
Const EVENT_ERROR = 1
Const EVENT_WARNING = 2
Const EVENT_INFORMATION = 4

Dim objFSO, objWSH, objLogFile
Dim argCount, iArg, flg
Dim RootFolder, Logfile, MaxHoursOld, Ext
Dim iDelFiles, iDelDirs
Dim bDeleteRoot, bDeleteSub,bVerbMode, bTestMode, bEventLog

On Error Resume Next

Set objWSH = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")

argCount = WScript.Arguments.Count
iArg = 0

' Check to see if the user is asking for help.
If argCount > 0 Then
    flg = LCase(WScript.Arguments(0))
    If (flg="help") Or (flg="/h") Or (flg="\h") Or (flg="-h") Or (flg="h") Or _
    (flg="/?") Or (flg="\?") Or (flg="-?") Or (flg="?") Then
        Call ShowUsage
    End If
End If

' Make sure that we have at least 2 arguments.
If argCount < 2 Then
    Call Fail("Usage: " & WScript.ScriptName & " /? for help.")
End If

' Initialize variables.
iDelFiles = 0
iDelDirs = 0
bDeleteSub = False
bDeleteRoot = False
bVerbMode = False
bTestMode = False
bEventLog = False

' Verify that the first argument is a folder and it exists.
RootFolder = NextArgument
Ext=Mid(rootfolder,Instr(rootfolder,"*.")+2)
RootFolder=Replace(RootFolder,"*." & ext,"")
Ext=Lcase(Ext)
If Not objFSO.FolderExists(RootFolder) Then
    Call Fail("Can't find " & chr(34) & RootFolder & chr(34) & ".")
End If

' Verify that the second argument is a valid number of hours.
MaxHoursOld = NextArgument
If IsNumeric(MaxHoursOld) Then
    If (MaxHoursOld >= 1) Then
        MaxHoursOld = Int(MaxHoursOld)
    Else
        Call Fail("Invalid MAXHOURSOLD parameter.")
    End If
Else
    Call Fail("Invalid MAXHOURSOLD parameter.")
End If

' If we have more than 2 arguments then error out.
If Not IsEmpty(NextArgument)Then
    Call Fail("Usage: " & WScript.ScriptName & " /? for help.")
End If

' Open the logfile if it was an option.
If Not IsEmpty(Logfile) Then
    Set objLogFile = objFSO.CreateTextFile(Logfile, True)
    Call CheckError
End If

' Everything should be ok so proceed with the purging.
Call LogToEventLog("Script has started...", EVENT_INFORMATION)
Call LogEvent("PurgeFiles.vbs has started..." & vbCrLf)
Call ScanFolder(RootFolder)

' Show the results. If there were any errors then the script would have exited already.
Call LogToEventLog("Script has ended..." & vbCrLf & "Deleted Files: " & _
                  iDelFiles & vbCrLf & "Deleted Folders: " & iDelDirs, _
                  EVENT_INFORMATION)

Call LogEvent(vbCrLf & "PurgeFiles.vbs is complete." & vbCrLf & "Deleted Files: " & _
            iDelFiles & vbCrLf & "Deleted Folders: " & _
            iDelDirs)

' Clean up.
Set objWSH = Nothing
Set objFSO = Nothing
If Not IsEmpty(Logfile) Then objLogFile.Close

' Exit the script.
WScript.Quit 0

'==========================================================================
Sub ScanFolder(sFolderName)

Dim objFolder, objSubFolders, objFiles
Dim Folder, File
Dim ret

On Error Resume Next
Set objFolder = objFSO.GetFolder(sFolderName)
Set objSubFolders = objFolder.SubFolders
Set objFiles = objFolder.Files

For Each Folder In objSubFolders
    ScanFolder (Folder.Path)
Next


For Each File In objFiles
    ret = HoursOld(File.Path)
    ' If the file older than the wanted # of hour then delete it.
    If ret > MaxHoursOld and Instr(Lcase(File.path),"." & Ext)>0 Then
        If bTestMode = False Then
            If StrComp(File.Path, Logfile, vbTextCompare) <> 0 Then
                Call LogEvent(File.Path & " is " & ret & " hours old. - FILE DELETED.")
                objFSO.DeleteFile File, True
                ' Call CheckError
            End If
        End If
        iDelFiles = iDelFiles + 1
    End If
Next

' If the folder is empty then delete the folder.
If objFiles.Count <= 0 Then
    If sFolderName = RootFolder Then
        If bDeleteRoot = True Then
            If bTestMode = False Then
                Call LogEvent(sFolderName & " is empty. - FOLDER DELETED")
                objFSO.DeleteFolder sFolderName, True
                Call CheckError
            End If
            iDelDirs = iDelDirs + 1
            Exit Sub
        Else: Exit Sub
        End If
    End If
    If bDeleteSub = True Then
        If bTestMode = False Then
            Call LogEvent(sFolderName & " is empty. - FOLDER DELETED")
            objFSO.DeleteFolder sFolderName, True
            Call CheckError
        End If
        iDelDirs = iDelDirs + 1
        Exit Sub
    Else: Exit Sub
    End If
End If

End Sub

'==========================================================================
Function HoursOld(sFileName)

Dim objFile

On Error Resume Next

Set objFile = objFSO.GetFile(sFileName)
Call CheckError

' Return the difference in hours.
HoursOld = Round(Cdbl(Now() - objFile.DateLastModified)*24)

End Function

'==========================================================================
' Extract argument value from command line, processing any option flags.
Function NextArgument

Dim arg

Do ' Loop to pull in option flags until an argument value is found.
    If iArg >=argCount Then Exit Function
    arg = WScript.Arguments(iArg)
    iArg = iArg + 1
    If (AscW(arg) <> AscW("/")) And (AscW(arg) <> AscW("-")) Then Exit Do
    Select Case UCase(Right(arg, Len(arg) -1))
        Case "E" : bEventLog = True
        Case "R" : bDeleteRoot = True
        Case "S" : bDeleteSub = True
        Case "T" : bTestMode = True
        Case "V" : bVerbMode = True
        Case Else
            If UCase(Mid(arg, 2, 2)) = "L:" Then
                LogFile = Mid(arg,4)
            Else
                Call Fail("Invalid option flag: " & arg)
            End If
    End Select
Loop

NextArgument = arg

End Function

'==========================================================================
Sub ShowUsage

WScript.Echo "CScript.exe " & WScript.ScriptName & " <rootfolder\*.filetype> <maxhoursold> [/R] [/S] [/T] [/V]" & vbCrLf & _
            vbTab & vbTab & vbTab & vbTab & vbTab & "            [/L:logfile]" & vbCrLf & vbCrLf & _
            "  rootfolder" & vbTab & "Specifies the directory to start purging files." & vbCrLf & _
            "  maxhoursold" & vbTab & "Specifies how old a file can be in hours before it is purged." & vbCrLf & _
            "  /E" & vbTab & vbTab & "Report status and results to the Event Log." & vbCrLf & _
            "  /L:logfile" & vbTab & vbTab & "Specifies a file to output the results to." & vbCrLf & _
            "  /R" & vbTab & vbTab & "Deletes the rootfolder if it is empty." & vbCrLf & _
            "  /S" & vbTab & vbTab & "Deletes any empty subdirectories." & vbCrLf & _
            "  /T" & vbTab & vbTab & "Test Mode - does not delete any files or directories." & vbCrLf & _
            "  /V" & vbTab & vbTab & "Verbose Mode - shows detailed information to the screen." & vbCrLf & _
            "  /?" & vbTab & vbTab & "Displays this message." & vbCrLf & vbCrLf & _
            WScript.ScriptName & " will not delete any directories by default."
WScript.Quit 1

End Sub

'==========================================================================
Sub CheckError()

Dim msg

If Err.Number = 0 Then Exit Sub
msg = Err.Source & " " & Hex(Err) & ": " & Err.Description

Call Fail(msg)

End Sub

'==========================================================================
Sub LogEvent(sMessage)

If bVerbMode Then WScript.Echo(sMessage)
If IsObject(objLogFile) Then objLogFile.WriteLine(sMessage)

End Sub

'==========================================================================
Sub LogToEventLog(sMessage, nValue)

If bEventLog Then objWSH.LogEvent nValue, WScript.ScriptName & ": " & sMessage

End Sub

'==========================================================================
Sub Fail(sMessage)

If bEventLog Then LogToEventLog sMessage, EVENT_ERROR
If IsObject(objLogFile) Then
    objLogFile.WriteLine(WScript.ScriptName & ": " & sMessage)
    objLogFile.Close
End If
' Optional write Error messages
' WScript.Echo WScript.ScriptName & ": " & sMessage

WScript.Quit(1)

End Sub
'~~[/script]~~
Avatar billede jnoval Nybegynder
16. december 2004 - 14:36 #10
Det virker. Smid et svar
Avatar billede majsmarken Nybegynder
16. december 2004 - 16:49 #11
Du ka' jo lige skrive hvad det endte med i din *.CMD fil...

Ellers Go' Jul osv ...
http://www.tuborg.dk/kampagner/j-dag/j-dag.html
Avatar billede jnoval Nybegynder
16. december 2004 - 21:39 #12
Så langt kom jeg ikke at jeg fik lavet en .cmd. Hvad er i grundes forskellen på om jeg bruger .cmd eller .bat.
Jeg konstanterede blot at vbs'en virkede på mine test filer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester