[VBS] hoe vergelijk ik 2 tijden met elkaar?

Pagina: 1
Acties:

  • poktor
  • Registratie: Mei 2003
  • Laatst online: 08-04 04:11
Hoi allemaal,

Ik ben niet erg bekend met vbs, maar nu wil ik dat gaan inzetten, om 2 tijden met elkaar te vergelijken:
Het gaat om het bewaken van mijn Counter Strike Source-server, waarop CSS als een service onderhuids draait (GameHost). Het probleem is, dat CSS, buiten de logs, verder op de harde schijf geen teken van leven geeft als ie draait, waardoor ik dus wat kunstgrepen uit moet halen om de boel in de gaten te houden. Zo kwam ik op de access-tijd van de logs-dir van CSS: de logs zijn zelf niet echt bruikbaar naar mijn idee, daar het huidige log altijd 0 bytes groot is. Elke mapwissel wordt er echter een nieuw log geschreven, zodat de access-tijd verandert. Deze tijd haal ik middels een dos-tooltje ("space map"; sm.exe /it) van de directory, waarmee ik de laatste access-time van deze directory krijg als een textfiletje. Het tooltje zet echter nog wat lijntjes e.d. neer, maar de access-tijd staat uiteindelijk aan de rechterkant, met links ervan de grootte van de dir en free space van de hd. Het is dus nodig, om deze tijd (xx:xx:xx) vanaf de rechterkant (altijd 2 posities vanaf rechterkant) te benaderen, alles links ervan kan wijzigen. Voorbeeldje:

Space Map 2.0 Copyright (c) 1991,1992 Ben Smith
╔══════════════════════════Ð═════════════Ð═════════════Ð══════════╗
║ Tree │ Size │ Alloc │ Time ║
Ã──────────────────────────┼─────────────┼─────────────┼──────────Â
║ D:\CSSSER~1\CSTRIKE\LOGS │ 130,039,576 │ 602,799,104 │ 03:43:32 ║
╚══════════════════════════¤═════════════¤═════════════¤══════════╝

Door middel van "findstr ..:..:.. > find.txt" blijft uiteindelijk het volgende over:

║ D:\CSSSER~1\CSTRIKE\LOGS │ 130,039,576 │ 602,799,104 │ 03:43:32 ║

De uiteindelijk hieruit gedestilleerde tijd wil ik vervolgens vergelijken met de huidige tijd en in het geval het verschil groter is dan 20 minuten, moet er gesignaleerd worden via een errorlevel, om alarmering te triggeren. (door het steeds veranderen van de access-tijd van de dir weet ik dan, dat een proces nog steeds loopt. Verandert de access-tijd niet meer, dan hangt de zooi.. )
Als iemand suggesties (of nog beter:voorbeelden) heeft om dit te bouwen, heel graag, ik heb zelf te weinig kaas hiervan gegeten.. :|
Als blijkt dat ik hier het wiel zit uit te vinden en er al iets beters voor dit doel is, hoor ik het uiteraard ook graag.. ;)

Alvast bedankt! _/-\o_

[ Voor 35% gewijzigd door poktor op 12-12-2005 23:20 . Reden: voorbeelden toegevoegd ]


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 25-03 00:07

Jurgle

100% Compatible

Als je tijden met elkaar wilt vergelijken kun je alles omzetten naar seconden, dus uit je voorbeeld is de tijd 3 * 3600 + 60 * 43 + 32. Deze kun je vergelijken met een opgeslagen waarde. Hierbij moet wel opgemerkt worden dat het fout gaat als 24:00:00 tussen de twee intervallen zit. Dus misschien moet je iets doen met een datum veld, of je geeft alleen een errorlevel als het verschil tussen de 20 minuten en 22 uur zit.

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • WvdWest
  • Registratie: Augustus 2002
  • Niet online
Eerst de tijd uit die regel halen (via regular expression bijv.) Dan via datediff vergelijken met de huidige tijd.

Even een heel ranzig script in elkaar gezet. Het gaat om het idee niet om de uitwerking.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
strRegel = "D:\CSSSER~1\CSTRIKE\LOGS ¦ 130,039,576 ¦ 602,799,104 ¦ 23:43:32 ¦"
Set re = new regexp
re.Pattern = "[0-9]*:[0-9]*:[0-9]*" 'Zoek op het patroon ##:##:##
re.IgnoreCase = true
set match = re.Execute(strRegel) 'Haal alles op dat aan het patroon voldoet
for each matched in match 'Loop alle gevonden items langs
    tijd = CDate(date & " " & matched.value) 'Maak van de gevonden tijd een volledige datum
next
huidigetijd = now 'Haal de huidige tijd en datum op
if tijd > huidigetijd then 'Als de tijd uit het bestand groter is dan de huidige tijd, dan is het nu net na twaalven
    tijd = tijd - 1 'Hier haal ik een dag af van de totaal tijd. Anders ligt de tijd in de toekomst.
end if
msgbox datediff("S", tijd, huidigetijd)/60 'Bepaal het verschil tussen de tijden in seconden en deel door zestig om de minuten te krijgen.

DateDiff zou ook minuten moeten pakken maar bij mij geeft die dan nul terug. Ik zal ongetwijfeld wat fout doen maar nu geen zin om dat uit te zoeken.

[ Voor 114% gewijzigd door WvdWest op 13-12-2005 01:14 ]

I'm not a complete idiot - several parts are missing.


  • poktor
  • Registratie: Mei 2003
  • Laatst online: 08-04 04:11
WvdWest schreef op dinsdag 13 december 2005 @ 00:31:
Eerst de tijd uit die regel halen (via regular expression bijv.) Dan via datediff vergelijken met de huidige tijd.

Even een heel ranzig script in elkaar gezet. Het gaat om het idee niet om de uitwerking.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
strRegel = "D:\CSSSER~1\CSTRIKE\LOGS ¦ 130,039,576 ¦ 602,799,104 ¦ 23:43:32 ¦"
Set re = new regexp
re.Pattern = "[0-9]*:[0-9]*:[0-9]*" 'Zoek op het patroon ##:##:##
re.IgnoreCase = true
set match = re.Execute(strRegel) 'Haal alles op dat aan het patroon voldoet
for each matched in match 'Loop alle gevonden items langs
    tijd = CDate(date & " " & matched.value) 'Maak van de gevonden tijd een volledige datum
next
huidigetijd = now 'Haal de huidige tijd en datum op
if tijd > huidigetijd then 'Als de tijd uit het bestand groter is dan de huidige tijd, dan is het nu net na twaalven
    tijd = tijd - 1 'Hier haal ik een dag af van de totaal tijd. Anders ligt de tijd in de toekomst.
end if
msgbox datediff("S", tijd, huidigetijd)/60 'Bepaal het verschil tussen de tijden in seconden en deel door zestig om de minuten te krijgen.

DateDiff zou ook minuten moeten pakken maar bij mij geeft die dan nul terug. Ik zal ongetwijfeld wat fout doen maar nu geen zin om dat uit te zoeken.
THANX! Hier kan ik wat mee. Bedankt! Hier ga ik lekker aan sleutelen! :P _/-\o_

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
WvdWest schreef op dinsdag 13 december 2005 @ 00:31:
Eerst de tijd uit die regel halen (via regular expression bijv.) Dan via datediff vergelijken met de huidige tijd.

Even een heel ranzig script in elkaar gezet. Het gaat om het idee niet om de uitwerking.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
strRegel = "D:\CSSSER~1\CSTRIKE\LOGS ¦ 130,039,576 ¦ 602,799,104 ¦ 23:43:32 ¦"
Set re = new regexp
re.Pattern = "[0-9]*:[0-9]*:[0-9]*" 'Zoek op het patroon ##:##:##
re.IgnoreCase = true
set match = re.Execute(strRegel) 'Haal alles op dat aan het patroon voldoet
for each matched in match 'Loop alle gevonden items langs
    tijd = CDate(date & " " & matched.value) 'Maak van de gevonden tijd een volledige datum
next
huidigetijd = now 'Haal de huidige tijd en datum op
if tijd > huidigetijd then 'Als de tijd uit het bestand groter is dan de huidige tijd, dan is het nu net na twaalven
    tijd = tijd - 1 'Hier haal ik een dag af van de totaal tijd. Anders ligt de tijd in de toekomst.
end if
msgbox datediff("S", tijd, huidigetijd)/60 'Bepaal het verschil tussen de tijden in seconden en deel door zestig om de minuten te krijgen.

DateDiff zou ook minuten moeten pakken maar bij mij geeft die dan nul terug. Ik zal ongetwijfeld wat fout doen maar nu geen zin om dat uit te zoeken.
Een regex KAN, maar wat als er een tijd in de rest van de tekst zit? Dan gaat je regex de mist in.
Ik zou het bestand gewoon per regel (CrLf) splitten in een array en vandaaruit verder werken.
Dat DateDiff nul teruggeeft is omdat je waarschijnlijk "m" gebruikt, maar dat is voor Maanden :P Ik zou eens "n" gebruiken ;)

Anyways, voorbeeldje dan maar van hoe ik het zou doen:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Option Explicit

Dim arrLines, sVal, T, lDiff
    
arrLines = Split(ReadFile("C:\Test.txt"), vbCrLf) 'Split het bestand in een array
For T = 0 To UBound(arrLines)                     'Lus door alle regels
    sVal = Left(Right(arrLines(T), 10), 8)        'Pak de "tijd" uit de string
    If IsDate(sVal) Then                          'Geldige tijd?
        If Abs(DateDiff("n", sVal, Time)) > 20 Then MsgBox "De tijd (" & sVal & ") in regel " & T & " wijkt meer dan 20 minuten van het huidige tijdstip af"
    End If
Next

'Leest het bestand (sFileName) in.
Private Function ReadFile(sFileName)
    Dim oFS, oFileStream
    Set oFS = CreateObject("Scripting.FileSystemObject")
    On Error Resume Next
    Set oFileStream = oFS.OpenTextFile(sFileName)
    ReadFile = oFileStream.ReadAll
End Function

Zo zou ik het doen :P

En stel dat je er zeker van kunt zijn dat er maar 1 tijd voor komt per regel, dan zou je dus i.c.m. de RegEx wel mooie "kruising" kunnen maken:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Option Explicit

Dim oRE, oMatches, oMatch

Set oRE = New regexp
oRE.Pattern = "[0-9]{2}:[0-9]{2}:[0-9]{2}"          'Zoek op het patroon ##:##:##
oRE.IgnoreCase = True
Set oMatches = oRE.Execute(ReadFile("C:\test.txt")) 'Haal alles op dat aan het patroon voldoet
For Each oMatch In oMatches                         'Loop alle gevonden items langs
    If Abs(DateDiff("n", oMatch.Value, Time)) > 20 Then MsgBox "De tijd (" & oMatch.Value & ") wijkt meer dan 20 minuten van het huidige tijdstip af"
Next


'Leest het bestand (sFileName) in.
Private Function ReadFile(sFileName)
    Dim oFS, oFileStream
    Set oFS = CreateObject("Scripting.FileSystemObject")
    On Error Resume Next
    Set oFileStream = oFS.OpenTextFile(sFileName)
    ReadFile = oFileStream.ReadAll
End Function


Maar die code neemt ook 7 regels in beslag :P (buiten de ReadFile functie dan). Daarbij heb ik de "*" in je RegEx vervangen door "{2}" omdat we exact 2 cijfers per "groepje" willen. Let ook op dat ik hier "Abs" gebruik in beide voorbeelden om afwijkingen van plus of minus 20 minuten of meer te vinden. Mocht je alleen maar plus of alleen maar minus verschillen willen vinden dan dien je dus de Abs te verwijderen en de laatste twee parameters van DateDiff evetueel om te draaien (of > 20 veranderen in < -20 :P )

Tot slot: Ik geef altijd de voorkeur aan Option Explicit, waardoor je je variabelen eerst dient te declareren. Zo voorkom je onnodige fouten. Helemaal netjes zou het zijn als je gebruikte objecten (zoals oRE of oFS en oFileStream) na gebruik weer netjes "vrijgeeft" door Set myObject = Nothing te doen, maar in dit geval gaan ze vanzelf out-of-scope en ach...

[ Voor 124% gewijzigd door RobIII op 13-12-2005 02:52 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij