Lo script Powershell di avvio di Windows non si chiude dopo Start-Process


5

Ho uno script di avvio Powershell V2.0 per il mio computer di lavoro (XP Professional 64-bit), come segue:

start "C:\Program Files (x86)\Microsoft Office\Office12\OUTLOOK.EXE" -ArgumentList "/recycle"
sleep -S 2
start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -ArgumentList "https://mail.google.com"
sleep -S 2
start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -ArgumentList "-new-window https://www.google.com/calendar"
sleep -S 2
start "C:\Program Files (x86)\Skype\Phone\Skype.exe"

Il sonno è garantire che le finestre vengano visualizzate sulla barra delle applicazioni nell'ordine corretto. Eseguo questo da un collegamento sul mio avvio veloce con il seguente obiettivo:

C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe C:\scripts\initialize.ps1

(Sì, questo è 2.0: powershell -Version 2.0funziona, come fa -Version 1.0, ma non -Version 3.0)

Il problema è che la finestra di comando rimane aperta fino alla chiusura delle finestre di Firefox, che non è quello che voglio. Guardando Process Explorer quando eseguo lo script, ecco cosa succede:

  1. powershell.exe appare sotto explorer.exe e appare la finestra Powershell (con uno sfondo nero, stranamente. Ma non è cmd.exe, poiché quando stavo eseguendo il debug i messaggi di errore dello script apparivano in rosso).
  2. outlook.exe appare sotto powershell.exe e appare la finestra di Outlook.
  3. firefox.exe appare sotto powershell.exe e appare una finestra di Firefox.
  4. Un secondo firefox.exe appare sotto powershell.exe e appare un'altra finestra di Firefox. Il secondo processo di Firefox termina quindi, come previsto, poiché Firefox utilizza solo un processo.
  5. skype.exe appare sotto powershell.exe e appare la finestra di Skype.
  6. Il processo powershell.exe rimane inspiegabilmente attivo, così come la finestra Powershell.

Se chiudo entrambe le finestre di Firefox, il processo powershell.exe si chiude e la finestra Powershell si chiude e i processi outlook.exe e skype.exe vengono visualizzati in explorer.exe come previsto.

Ho il sospetto che ciò abbia a che fare con l'input, l'output e l'errore standard di Firefox: non mi aspetto che Outlook o Skype abbiano mai prodotto nulla sulla console, ma Firefox ha opzioni da riga di comando che gli consentono di farlo. Ho esaminato il mio aspetto: l'utente ha impostato i valori e non ha trovato nulla di sospetto. Infine, se ho già un'istanza di firefox.exe in esecuzione (avviata dal collegamento sul desktop) il problema non si verifica (il processo powershell.exe si chiude come dovrebbe).

Quindi cosa sta succedendo qui? Proverò ad aggiungere -WindowStyle nascosto al collegamento successivo (devo chiudere Firefox per testarlo), ma voglio arrivare in fondo a questo, se non altro per migliorare la mia comprensione di come funzionano le console di Windows.


Prova a -NoNewWindowcambiare con firefox-es?
Massimo

Risposte:


3

L'aggiunta -WindowStyle hiddenal Target ha funzionato come un incantesimo; la finestra vagante di Powershell non si trova da nessuna parte, sulla barra delle applicazioni o in Process Explorer. Non so ancora perché questo problema si sia verificato in primo luogo, ma almeno fa quello che dovrebbe.


1

Dici che Firefox potrebbe tenere aperti gli standard Input, Output e / o Error. I miei test non sono stati in grado di riprodurre il tuo problema (ovvero la finestra di PowerShell si chiude a prescindere), ma ho notato che Firefox ha un sacco di output di debug.

È possibile provare Start-Processle funzioni di reindirizzamento per reindirizzare l'output standard e l'errore NUL(essenzialmente, scartando l'output).

Per fare ciò, aggiungi semplicemente i seguenti due argomenti al Start-Processcomando:

-RedirectStandardOutput "C:\Program Files (x86)\Mozilla Firefox\NUL" -RedirectStandardError "C:\Program Files (x86)\Mozilla Firefox\components\NUL"

NB: Sebbene NULessenzialmente scarti l'output, PowerShell rifiuterà di utilizzare lo stesso 'file' sia per Output che per Errore. Poiché NUL"esiste" in ogni directory, l'utilizzo di directory diverse funziona in questo modo - e potremmo anche tenerlo limitato alle directory di Firefox.


Interessante. Dove hai visto l'output di debug? In realtà non ne ho visto nessuno; era solo una supposizione su cosa potesse succedere. Dal momento che -WindowStyle hiddensembra funzionare, lo seguirò, ma qualcosa come Unix /dev/nullera qualcosa che desideravo, quindi apprezzo il suggerimento in ogni caso. Inoltre, penso che puoi usare qualcosa di simile 2>&1per reindirizzare sia l'output che l'errore sullo stesso file.
Vanessa Phipps,

@MatthewPhipps Non ero sicuro che 2>&1avrebbe funzionato con Start-Processargomenti (invece di usare >NUL). L'output di debug viene visualizzato se provo quel comando nella finestra dell'interprete di PowerShell - non si blocca (ovvero posso ancora eseguire altri comandi), ma c'è ancora output. Potresti anche provare exitalla fine, immagino. Se sei soddisfatto del tuo attuale metodo di nascondere la finestra, dovresti accettare la tua risposta.
Bob
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.