Wie kann ein (PowerShell) -Skript beim Start feststellen, dass es ausgeführt wird?

386
Teknowledgist

Ich baue ein PoSh-Startskript, das ein paar geplante Aufgaben initialisiert. Eine Aufgabe wird bei der Benutzeranmeldung und eine andere im Leerlauf ausgelöst. Beide Tasks führen das Skript erneut aus. Beim Start wird nur der erste Teil des Skripts benötigt, das gesamte Skript sollte jedoch alle anderen Zeiten ausgeführt werden.

Wie kann ein Skript feststellen, wann es beim Systemstart ausgeführt wird und zu einem späteren Zeitpunkt ausgeführt wird?

2
Können Sie nicht einen anderen Parameter oder ein anderes Skript übergeben, bei dem das vollständige Skript den Startteil aufruft, bevor Sie mit den restlichen Befehlen fortfahren? AFH vor 6 Jahren 0
Wie oft führen Sie das Skript den ganzen Tag durch? Cory Knutson vor 6 Jahren 0
Schwer zu sagen. Leerlaufüberprüfungen alle 15 Minuten, aber der Task hat eine Verzögerung, um das Skript auszuführen. Das Skript wird auch kurz nach der Anmeldung ausgeführt, es hängt also von der Anzahl der Benutzer ab. Teknowledgist vor 6 Jahren 0
Auf einem Linux-System würde ich bei jeder Ausführung des Skripts eine Datei berühren (das letzte bearbeitete Datum aktualisieren). Dann können Sie die Betriebszeit mit der Differenz der letzten Bearbeitungszeit und der aktuellen Uhrzeit vergleichen. Dies gibt an, ob die letzte Bearbeitungszeit vor dem letzten Start (Skript wird beim Start ausgeführt wird) oder nach dem letzten Start (Skript wird im Leerlauf ausgeführt) ausgeführt. Ich hoffe, das hilft Ihnen / jemand, diese Idee in die Windows-Umgebung zu übersetzen. agtoever vor 6 Jahren 0

2 Antworten auf die Frage

3
Cory Knutson

Ich würde auch die Parameteroption empfehlen. Erstellen Sie zwei geplante Tasks, von denen einer beim Start ausgeführt wird, wodurch der -AtStartupSwitch aufgerufen wird. Dann können Sie eine zweite Aufgabe erstellen, um das Skript ohne den Schalter aufzurufen. Der Schaltertyp für Parameter ist für diesen Zweck gebaut.

Function Start-Task { [CmdletBinding()] Param( [Parameter(Mandatory=$True,Position=1)] [string]$paramOne,  [Parameter(Mandatory=$True)] [string]$paramTwo,  [switch]$AtStartup )  if ($AtStartup) { #Do startup activities.... Test-Connection -ComputerName Localhost }  #Rest of script work } 
Ein Wechsel ist eine gute Idee. Ich würde Ihren Vorschlag einer zweiten geplanten Aufgabe umkehren, jedoch den Schalter im Gruppenrichtlinienobjekt verwenden. Bei jedem zweiten Mal wird es nicht den Schalter haben und es wird nicht beim Start sein. Vielen Dank. Teknowledgist vor 6 Jahren 0
Technisch gesehen weiß das Skript jedoch nicht, dass es beim Start ausgeführt wird. Es weiß nur, dass es * gesagt * wird, dass es beim Start ausgeführt wird. Ich bin immer noch neugierig, ob es einen definitiveren Weg gibt, den Startstatus von Windows heraus zu verbessern. Vielleicht prüfen, ob der Anmeldedienst seit dem letzten Start nicht gestartet wurde? Teknowledgist vor 6 Jahren 0
2
Patrick Seymour

Du könntest benutzen

[System.Environment]::TickCount

um die Anzahl der seit dem Systemstart verstrichenen Millisekunden zu erhalten.

Ich dachte an etwas Ähnliches, aber welcher Wert wäre jedes Mal richtig? Zu kurz und manchmal wird angenommen, dass es beim Start aufgrund von Aktualisierungen oder anderen Verzögerungen vor dem Skript nicht ausgeführt wird. Zu lang (länger als 15 Minuten) und manchmal läuft es im Leerlauf und man denke, es ist beim Start. Teknowledgist vor 6 Jahren 0
Dafür gibt es wahrscheinlich keine richtige Antwort. Es hängt davon ab, wie viele Dienste und Treiber beim Start geladen werden, ob der Computer so eingestellt ist, dass Skripts asynchron oder synchron ausgeführt werden usw. Ich denke, Sie müssten einige Testläufe durchführen, um Werte für Ihre Umgebung zu erhalten. Patrick Seymour vor 6 Jahren 0