Avatar billede majsmarken Nybegynder
05. september 2003 - 08:55 Der er 17 kommentarer og
1 løsning

Info om VBscript tips/hint/kode/eksempler ?

Dette er en slags opfølgning på
http://www.eksperten.dk/spm/393648
handler om dette program
http://cwashington.netreach.net/depo/view.asp?Index=723&ScriptType=vbscript#

Programmet virker fint men jeg ønsker at fedte med koden således at det er muligt at definere antal timer (HourOld) før en fil bliver slettet. I nuværende version er det "kun" antal dage (DaysOld).

Hvor kan jeg finde tips/hint/kode/eksempler på den slags programmering.
Og/eller
Hvad skal ændres i programmet til at det er antal timer (hour) der er tale om ?
Avatar billede nmh Nybegynder
05. september 2003 - 10:29 #1
Funktionen DaysOld(sFileName) i scriptet angiver filens alder i hele dage.

Hvis du i stedet  brugte nedenstående funktion, ville du få angivet filens alder i enheden timer.

Function HoursOld(sFileName)

Dim objFile

On Error Resume Next

Set objFile = objFSO.GetFile(sFileName)
Call CheckError

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

End Function
Avatar billede nmh Nybegynder
05. september 2003 - 10:43 #2
For god ordens skyld, skal kommentaren
'Return the difference in days
ændres til
'Return the difference in hours

Den ændrede funktion angiver som sagt alderen i timer, men jeg valgte at der medtages decimaler. Hvis du kun vil have hele timer, skal der for HoursOld nu stå
HoursOld = Round(Cdbl(Now() - objFile.DateLastModified)*24)

Så vil dit programe kunne bruges uændret, hvis du bibeholder alle navne (den nye funktion, skal så stadig hedde DaysOld), men nu skal alderen altså angives i timer.
Avatar billede nmh Nybegynder
05. september 2003 - 10:50 #3
I scriptet er det variablen maxdaysold, der styrer, om en fil er for gammel.
Dette tal, skal så blot indlæses i som et antal timer.

I den ændrede funktion valgte jeg at bruge funktion Round, for at få et helt antal timer. Dvs at en fil der er 31 minutter gammel vil blive opfattet som  en fil, der er en 1 time gammel.
Avatar billede majsmarken Nybegynder
12. september 2003 - 09:22 #4
<nmh>: Det bliver formegentligt først i kommende weekend at jeg før 'leget' med dette, men ser lovende ud...

Hvis/når jeg får det til at virke smider jeg hele koden her på dette spm.

Hvor på nettet kan jeg finde tips/hint/kode/eksempler på den slags programmering ?

Senerer skal jeg også finde på noget der sletter filer på 0 (nul) bytes...
Avatar billede nmh Nybegynder
12. september 2003 - 23:52 #5
For at se mere om denne slags programmering:
Søg på Google med søgestrengen

vbscript filesystemobject
Avatar billede majsmarken Nybegynder
14. september 2003 - 13:08 #6
Nu er den lige ved at være der - ja den er faktisk i brug nu MEN der er nu det "problem" at jeg helst kun vil slette filer med et bestemt extention/efternavn - her *.dif.
Hvad skal der ændres i koden fra
http://cwashington.netreach.net/depo/view.asp?Index=723&ScriptType=vbscript
for at få den option ?

Jeg kan pt. definere som arg E:\ som det drev der skal slettes fra men hvis jeg også kunne skrive E:\*.dif ...

<nmh>: Jeg smider ekstra POINT til dig hvis det virker...
Avatar billede nmh Nybegynder
14. september 2003 - 20:09 #7
jeg ser på det, men kommer nok først med et forslag i løbet af mandagen. Måske først mandag aften.

Men du vil altså gerne kunne nøjes med at få slettet filer af typen *.dif, hvis de er gamle nok, og du skal have mulighed for også at at vælge andre filtyper?
(en måde var jo, at sørge for, at en fil kun blev slettet, hvis den haved efternavnet dif, og du slet ikke behøvede at skrive det)
Avatar billede majsmarken Nybegynder
14. september 2003 - 23:09 #8
<nmh>: Pointen er at der er en *.log fil i samme mappe som omtalte *.dif filer. Denne er "låst" af systemet; der bliver løbende added logging dertil af hovedprogrammet (grabber videosekvenser). Nogle gange med timers mellemrum.
Når SCRIPT programmet ruller vil det jo også forsøge at slette denne *.log fil (hvis den ikke er ændret i X tid), men melder så fejl:
[Microsoft VBScript-kørselsfejl 46: Tilladelse nægtet].

Derfor vil jeg kunne selecte *.DIF som videosekvenserne hedder og så kun slette dem.

ELLER

Undertrykke fejlmeddelser alá ovenstående og fortsætte sletning af resten.
(Jeg kunne forestille mig at denne option ville være lettest ?)

Kommentar ?
Avatar billede nmh Nybegynder
14. september 2003 - 23:14 #9
Hvis det kun er problemet med denne fil, som altså hedder
....log så vil det nok være lettere at sørge for at filer med dette efternavn ikke bliver slettet.
Men det ville selvfølgelig være en rar generel ting, at kunne slette filer med udvalgte efternavne.
Avatar billede nmh Nybegynder
15. september 2003 - 14:02 #10
Nu har jeg fundet en løsning.
Hvis du vil slette filer med efternavnet qzx i et katalog, og du plejer at skrive
slet E:\ bla bla bla skal du nu skrive
slet E:\*.qzx bla bla bla

Du skal ændre således:

I begyndelsen står der en linie
Dim RootFolder, MaxDaysOld, Logfile
den skal ændres til
Dim RootFolder, MaxDaysOld, Logfile, Ext

ca. 1/3 nede i filen står der
' Verify that the first argument is a folder and it exists.
RootFolder = NextArgument
If Not objFSO.FolderExists(RootFolder) Then
det skal nu være:

RootFolder = NextArgument

Ext=Mid(rootfolder,Instr(rootfolder,"*.")+2)
RootFolder=Replace(RootFolder,"*." & ext,"")
Ext=Lcase(Ext)

If Not objFSO.FolderExists(RootFolder) Then

I midten af filen står:
    ret = DaysOld(File.Path)
    ' If the file older then the wanted # of days then delete it.
    If ret > MaxDaysOld Then

det skal nu være:

  ret = DaysOld(File.Path)
    ' If the file older then the wanted # of days then delete it.
    If ret > MaxDaysOld and Instr(Lcase(File.path),"." & Ext)>0 Then
Avatar billede nmh Nybegynder
17. september 2003 - 00:24 #11
Kan du bruge mit nye forslag?
Avatar billede majsmarken Nybegynder
17. september 2003 - 07:22 #12
<nmh>: Jeg får først mulighed for at afprøve det sidst på ugen/først i næste uge. Jeg har fri i denne uge efter en laaaaaang weekend"vagt".
Det ser lovende ud; du har endda også taget hensyn til 'case' ka' jeg tyde...

Vender tilbage... Er på anden måde 'arbejdsramt' i dene uge...
Avatar billede nmh Nybegynder
29. september 2003 - 22:55 #13
Nå, kan du bruge det?
Avatar billede majsmarken Nybegynder
01. oktober 2003 - 13:57 #14
<nmh>: Vender tilbage... Er på anden måde 'arbejdsramt' fortiden...
Avatar billede nmh Nybegynder
01. oktober 2003 - 14:07 #15
ok
Avatar billede majsmarken Nybegynder
09. oktober 2003 - 20:36 #16
Gode nyheder og mindre gode nyheder:

Det virker fint med
purgefiles.vbs E:\*.dif 3 /L:deleted-dif.log
Sletter alle *.dif filer ved E: skriver i log fil osv. som ønsket.

MEN
ved E:\ findes også en *.LOG fil som er (meget) låst af systemet.
Programmet "brækker" sig hvis denne fil findes med følgende i logfilen:
"Der opstod en Microsoft VBScript-kørselsfejl 5: Procedurekaldet eller argumentet er ugyldigt"
Også selvom jeg IKKE har valgt at slette *.LOG filer...

Hmmm...
Bare for at gi' et svar med det samme.
Jeg kikker også selv lidt videre...
Avatar billede majsmarken Nybegynder
12. oktober 2003 - 14:54 #17
KLARET...
Den linie i koden som får programmet til at stoppe med "Microsoft VBScript-kørselsfejl 5" blev bare fjernet. Så fortsætter programmet som ønsket...

Er nu instaleret på >20 systemer - har kørt et par dage - reslutat præcist som ønsket...

Extra point til <nmh> ved http://www.eksperten.dk/spm/412969
Avatar billede majsmarken Nybegynder
12. oktober 2003 - 14:58 #18
'~~[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 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
Kurser inden for grundlæggende programmering

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