waldschr4t
Goto Top

WSH - Filezugriff macht Ärger

Überprüfen ob eine File "bereit" ist, ob man lesen / schreiben kann

Wir haben das Problem, dass under WSH-Script manchmal Probleme beim Dateiaufruf erzeugt. Es soll nur "Stopped" oder "Running" in eine *.txt-Datei schreiben, gibt aber manchmal eine Fehlermeldung: "Erlaubnis verweigert" an der Stelle an der man die Datei öffnet. Kann man das Abfangen, oder irgendwie mehrmals probieren bis es geht? Kann es sein, dass dieser Fehler auftritt, wennn man eine Datei aus einer Batchdatei heraus anspricht? Oder kann es daran liegen, dass das WSH-Skript 2 mal recht schnell hintereinander ausgeführt wird?


Const ForAppending = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objLogFile = objFSO.OpenTextFile("service.txt", _   
    ForAppending, True)

strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  

Set colListOfServices = objWMIService.ExecQuery _
        ("Select * from Win32_Service where Name='Apache2'")  

For Each objService in colListOfServices
    objLogFile.Write(objService.State)
Next
objLogFile.Close

Content-ID: 20798

Url: https://administrator.de/contentid/20798

Ausgedruckt am: 23.11.2024 um 03:11 Uhr

gemini
gemini 01.12.2005 um 19:13:13 Uhr
Goto Top
Hallo WaldSchr4t,

zunächst, ForAppending hat den Wert 8, 2 = ForWriting.

Ich nehme an, dass die Rechte auf service.txt passen.

An dem Aufruf aus einem Batch heraus wird es nicht liegen.
Wahrscheinlicher ist, dass die service.txt zum zweiten Mal geöffnet wird, bevor sie geschlossen worden ist.

Gruß
gemini
coli
coli 01.12.2005 um 23:59:30 Uhr
Goto Top
gelöscht, da blödsinn ..
Biber
Biber 02.12.2005 um 18:05:09 Uhr
Goto Top
@coli
Ich finde Deinen Tipp genial - wenn ich geahnt hätte, dass sich in WSH einfach on the fly Methoden dazuerfinden lassen wie Deine objLogFile.Quit, dann wäre ich schon vor Monaten von Bätch auf WSH umgestiegen.

Kann ich denn auch einfach schreiben:
If objLogFile.AnyProblems Then objLogFile.ForgetIt
??

@WaldSchr4T
Wenn Du die Wahrscheinlichkeit der Zugriffskollisionen minimieren willst, dann stell Deine paar Zeilen sinnvoll um und öffne die Logdatei erst, wenn Du etwas zu schreiben hast.
Im Moment ist die Logdatei exclusiv geöffnet, bevor Du überhaupt ein Objekt objWMIService erstellt hast, geschweige denn dieses geantwortet hat. Wenn dieser Service sich (theoretisch) mal 3 Minuten Zeit lässt zum Antworten, ist die Datei für diese Dauer gesperrt.
Wenn der CodeSchnipsel an dieser Stelle abschmiert (Objekt kann nicht erstellt werden und Programm knallt weg), dann würde ich auch nicht darauf wetten, das M$ das offene FileHandle sofort schließt.
Kleine Randfrage: Wie sinnvoll ist denn so ein LogFile, in dem dann nach ein paar Wochen meterlang Zeilen mit "Running" und "Stopped" untereinanderstehen?

Schönes Wochenende
Biber
[Edit] @coli
Sorry, coli, sooo vernichtend hab ichs auch nicht gemeint... ich wollte nur die "objLogFile.Quit" nicht unkommentiert stehen lassen.
Ich war wohl ein bisschen übermütig, weil endlich Wochenende ist. Tut mir Leid. War aber bezogen auf den Tipp und nicht die Person. [/Edit]