Ich habe ein Batch-Skript, das über einen AT-Befehl ausgeführt wird und möglicherweise mehrmals ausgeführt wird. Wenn es startet, muss es erkennen, ob es bereits ausgeführt wird, und wenn ja, sofort beenden (das zweite).
- Es muss robust sein und funktionieren, wenn die Skripte unerwartet beendet werden (dh ich kann beim Eintritt kein Flag setzen und beim Beenden löschen).
- Es muss in einer Remotedesktopsitzung ausgeführt werden
- Ich bin mit Powershell v2 auf XP festgefahren, aber es macht mir nichts aus, eine kleine Exe zu schreiben, wenn ich es nicht in Batch / Powershell oder VBS machen kann
- Das Skript muss minimiert ausgeführt werden, daher starte ich es mit Start "NAME" / MIN% COMSPEC% / C "MyScript.bat".
- Andere cmd-Fenster sind möglicherweise geöffnet, daher muss ich das laufende Skript überprüfen
- Das Batch-Skript wird als SYSTEM-Benutzer ausgeführt, ich kann jedoch keine WMI verwenden
Ich habe PowerShell Get-Process verwendet, um MainWindowTitle anzuzeigen, aber dies funktionierte nicht, wenn eine Remoteverbindung zum Computer hergestellt wurde, da das Skript möglicherweise ausgeführt wird, aber in dieser Remoteverbindungsinstanz nicht angezeigt wird. In diesem Fall wird der cmd-Prozess von Get-Process angezeigt, aber der MainWindowTitle ist leer.
Ich habe Get-Process ausprobiert und mir die erweiterte Eigenschaft StartInfo.EnvironmentVariables angesehen, kann jedoch nicht sehen, wie eine env-Variable erstellt wird, damit sie in der Eigenschaft angezeigt wird.
Ich habe überlegt, / WAIT im Startbefehl zu verwenden, dann bleibt das AT geöffnet, bis es beendet ist, aber das Skript, das das AT enthält, wird nicht minimiert
Irgendwelche Ideen?
quelle
Antworten:
Ich glaube, eine Sperrdatei ist die einfachste zuverlässige Lösung. Der Trick besteht darin, sicherzustellen, dass Ihr laufender Batch-Prozess eine exklusive Schreibsperre für die Datei beibehält, bis sie beendet wird. Das Schöne an diesem System ist, dass Windows die Sperre aufhebt, unabhängig davon, aus welchem Grund der Stapel beendet wird.
Sobald Sie eine Sperrdatei haben, müssen Sie feststellen können, ob die Datei derzeit gesperrt ist. Ich beschreibe dies unter Wie überprüfe ich in der Befehlszeile, ob eine bestimmte Datei oder ein bestimmtes Verzeichnis gesperrt ist (von einem Prozess verwendet)?
Ich habe diese primitive, aber effektive Technik verwendet, um einige ziemlich anspruchsvolle Aufgaben mit Windows-Batch auszuführen:
Sie wissen nicht, wo sich die Batchdatei befindet - auf dem Remotecomputer oder dem lokalen Computer oder ob Sie das Skript möglicherweise auf mehreren Computern gleichzeitig ausführen, aber nur auf einem aktiven Prozess pro Computer.
Wenn sich das Batch-Skript auf dem Remote-Computer befindet und Ihr Prozess Schreibzugriff auf das Skript hat, können Sie die Batch-Datei selbst als Sperrdatei verwenden! Sie müssen lediglich eine Unterroutine aufrufen, während Sie ein nicht verwendetes Dateihandle im Append-Modus zum Batch-Skript umleiten. Der CALL schlägt fehl, wenn ein anderer Prozess bereits eine Sperre hat. Die Sperre wird automatisch aufgehoben, wenn das Skript beendet wird (unabhängig davon, wie es beendet wird).
myscript.bat
Wenn sich Ihr Skript auf einem anderen Computer als dem Prozess befindet, der Prozess jedoch jeweils nur auf einem Computer ausgeführt wird, funktioniert das oben Gesagte meiner Meinung nach weiterhin.
Möglicherweise besteht eine bessere Alternative darin, auf jedem Remotecomputer eine dedizierte Sperrdatei einzurichten, die vom Batch-Skript getrennt ist. Anschließend können Sie den Prozess auf beliebig vielen Remotecomputern ausführen.
quelle
Danke für die Hilfe. Ich habe folgendes implementiert:
Das scheint in Ordnung zu sein, weitere Tests werden es zeigen.
quelle
Ich habe ein automatisiertes Plugin namens CMDS erstellt, das Sie hier verwenden können: Wie würde ich sehen, ob eine bestimmte Batch-Datei ausgeführt wird, und die PID erhalten? Ich bin mir jedoch nicht sicher, ob dies mit XP funktioniert.
Beispielbefehl:
CMDS /TS "Your Batch File Title"
Es hat auch einen GUI-Modus für sich.
Hier ist die Hilfedatei:
quelle