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-Key: 20798

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

Printed on: April 20, 2024 at 04:04 o'clock

Member: gemini
gemini Dec 01, 2005 at 18:13:13 (UTC)
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
Member: coli
coli Dec 01, 2005 at 22:59:30 (UTC)
Goto Top
gelöscht, da blödsinn ..
Member: Biber
Biber Dec 02, 2005 at 17:05:09 (UTC)
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]