BAT-Datei zum Ausführen und Stoppen eines Hintergrundprozesses in Windows

3

Ich möchte mit meiner PHP-App zwei einfache Windows-Bat-Dateien bündeln, mit denen ein in PHP integrierter Webserver gestartet und gestoppt werden kann, um die App auf localhost zu testen.

Das ist, worauf ich winlaunch.batbis jetzt gekommen bin :

php.exe -S 127.0.0.1:80 -t path/to/my/app/webroot my_app_bootstrap_script.php

Dinge, die ich nicht tun kann:

  • Wie leite ich die Ausgabe in eine Protokolldatei um?
  • Wie schließe ich das Befehlsfenster automatisch, wenn es über den Windows Explorer aufgerufen wird, damit die App weiterhin ausgeführt wird?
  • Was füge ich in das Stopp-Skript ein?
  • Wie überprüfe ich, ob die App bereits ausgeführt wird?
NotGaeL
quelle

Antworten:

4

Das Umleitungszeichen unter Microsoft Windows wie auch unter anderen Betriebssystemen wie Linux, OS X usw. ist ">". So können Sie die Ausgabe wie folgt umleiten:

php.exe -S 127.0.0.1:80 -t path/to/my/app/webroot my_app_bootstrap_script.php > "C:\somedir\php.log"

Ändern Sie den Verzeichnispfad und den Dateinamen nach Ihren Wünschen. Sie müssen diese Informationen nicht in doppelte Anführungszeichen setzen, es sei denn, Sie haben ein Leerzeichen im Verzeichnispfad oder im Dateinamen, aber Sie tun dies, wenn ein Leerzeichen vorhanden ist und es nicht schadet, sie in beiden Fällen einzuschließen.

Hinweis: Wenn Sie das Zeichen ">" verwenden und bereits eine Datei mit dem von Ihnen angegebenen Speicherort und Namen vorhanden ist, wird diese Datei überschrieben. Wenn Sie stattdessen möchten, dass die Protokolldatei weiter wächst, dh beim nächsten Start von php.exe an eine vorhandene Datei angehängt werden soll, verwenden Sie >>statt >. Dies führt dazu, dass die Datei erstellt wird, wenn sie nicht vorhanden ist. Die Ausgabe wird jedoch an eine vorhandene Datei angehängt.

Mit dem Befehl taskkill können Sie einen Prozess beenden. Zum Beispiel könnten Sie verwenden:

taskkill /f /fi "imagename eq php.exe"

Das wird /fmöglicherweise nicht benötigt, aber mit dieser Option können Sie den Befehl taskkill veranlassen, Prozesse zu schließen, die andernfalls möglicherweise nicht geschlossen werden. Das /fifiltert die Ausgabe des Befehls taskkill. In diesem Fall würden Sie filtern, sodass nur Prozesse mit dem Namen php.exe angezeigt werden. Wenn der Prozess nicht ausgeführt wird, wird Folgendes angezeigt, wenn Sie diesen Befehl absetzen:

C:\>taskkill /fi "imagename eq php.exe"

INFO: No tasks running with the specified criteria.

Sie können mit dem Befehl tasklist überprüfen, ob php.exe bereits ausgeführt wird:

tasklist /fi "imagename eq php.exe"

Das zeigt Ihnen alle Instanzen eines Prozesses mit dem Namen php.exe, die ausgeführt werden. In einigen Fällen können mehrere Prozesse mit demselben Namen ausgeführt werden, z. B. chrome.exe. In anderen Fällen, wie z. B. explorer.exe, sollte nur eine angezeigt werden, und die folgende wird angezeigt:

C:\>tasklist /fi "imagename eq explorer.exe"

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
explorer.exe                 91484 Console                    1     37,424 K

Sie können auch überprüfen, ob es ausgeführt wird, indem Sie die Ausgabe des Befehls "tasklist" mit dem Befehl "|" an den Befehl "find" weiterleiten. Pipe-Charakter. Z.B:

C:\>tasklist /fi "imagename eq explorer.exe" | find /i /c "explorer.exe"
1

Die /iInstruktionen finden, dass die Groß- und Kleinschreibung von Buchstaben ignoriert werden muss, z. In diesem Fall wird es wahrscheinlich nicht benötigt, wenn der Prozess immer "php.exe" heißt, aber ich habe es erwähnt, falls Sie find "Php.exe"den Prozess "php.exe" verwenden könnten. Der /cBefehl tell find zählt nur die Anzahl der Vorkommen der Zeichenfolge, nach der gesucht werden soll.

Wenn das Ergebnis "1" ist oder größer, wenn der Prozess mehr als einmal ausgeführt werden kann, wird er ausgeführt. Wenn es "0" ist, läuft es nicht. In Ihrem Fall lautet die Antwort wahrscheinlich immer 0 oder 1 und Sie würden "explorer.exe" in "php.exe" ändern. Wenn Sie möchten, können Sie das Ergebnis testen und den Befehl taskkill ausgeben, wenn der Wert nicht Null ist, oder Sie können den Befehl taskkill jederzeit ausgeben, wenn der Prozess angehalten werden soll, wenn er ausgeführt wird. Wenn der Befehl taskkill nicht ausgeführt wird, wird nur "INFO: Keine Aufgaben mit den angegebenen Kriterien ausgeführt" gemeldet.

Wenn Sie nicht möchten, dass das Fenster geöffnet bleibt, können Sie den Befehl "start" in Ihrer Batch-Datei verwenden. Z.B,

start "PHP" "php.exe -S 127.0.0.1:80 -t path/to/my/app/webroot my_app_bootstrap_script.php"

Das "PHP" nach dem Befehl liefert einen Titel für das Fenster. Sie können den Befehl start /?an einer Eingabeaufforderung eingeben, um die Optionen für den Startbefehl anzuzeigen.

Mondpunkt
quelle
Vielen Dank, dass Sie sich die Zeit genommen haben, alle meine Fragen zu beantworten. Ich werde das auf meinen Lesezeichen behalten, weil ich sicher bin, dass ich es früher oder später wieder brauchen werde
;-)