RS232 book cover

Centrum Outlook Express Centrum Outlook Express

OE PowerTool 4.5.5


Twój adres IP to: 3.133.159.224
Przeglądarka: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)

Zabijanie i restart procesów pod Windows - skrypt w PowerShellu

   Ostatnio na Usenecie (kto dziś jeszcze pamięta co to jest?) pojawiło się pytanie o to, jak pod Windows uruchomić proces, a po zadanym czasie zabić go i potem to wszystko powtarzać w pętli. Pytanie było pod kątem rozwiązania za pomocą skryptu BAT/CMD. Jak się okazuje, jest to niby proste, ale nie do końca. Uruchomić proces możemy poleceniem start. Potem już jest gorzej, bo trzeba odczekać odpowiednią ilość czasu, np. 15 sekund. Niestety nikt w Microsofcie nie pomyślał o czymś takim jak polecenie do opóźnienia. Niektórzy kombinują z poleceniem ping, które wysyła pakiety ICMP co sekundę i można podać ilość pakietów a tym samym ilość sekund. Jest to jednak partyzantka. Żeby było bardziej elegancko, można sobie ściągnąć np. windowsowy port linuksowego polecenia sleep. Ale OK, przejdźmy do zabicia procesu. Mamy do tego polecenie taskkill, któremu możemy podać proces np. przez nazwę pliku exe, tytuł okna albo PID. Fajnie, ale co w momencie, gdy jest kilka takich samych procesów? Uruchamiając proces poleceniem start nie dostajemy jego PIDa. Można próbować po tytule okna jeśli w ogóle proces wyświetla jakieś okno. Tutaj z kolei mogą być konieczne symbole wieloznaczne, ale niestety działają one kiepsko. Nie można podać jako filtr wyrażenia zaczynającego się od gwiazdki, sama gwiazdka też nie działa. Nie wiem skąd założenie, że coś musi być przed gwiazdką, czyli że początek nazwy okna musi być stały. Tak więc jest dosyć kiepsko. Może dałoby się za pomocą tasklist pobrać początkową listę procesów, odpalić nowy proces przez start i porównać z nową listą procesów? Tylko w skrypcie BAT/CMD będzie to pewnie bardzo żmudne. A może ktoś ma jakiś pomysł? Ja tradycyjnie przy problemach ze skryptach oldschoolowej windowsowej powłoki polecam PowerShell:

while($true) {
   $app = start-process -passthru notepad
   sleep 5
   kill $app.Id
   $app = start-process -passthru calc
   sleep 5
   kill $app.Id
}


Parametr -passthru jest konieczny, gdyż inaczej start-process nie zwraca obiektu.