3

У меня есть сценарий запуска Powershell V2.0 для моего рабочего компьютера (64-разрядная версия XP Professional):

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"

Сны должны гарантировать, что окна появляются на панели задач в правильном порядке. Я запускаю это из ярлыка на панели быстрого запуска со следующей целью:

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

(Да, это 2.0: powershell -Version 2.0 работает, как -Version 1.0 , но не -Version 3.0)

Проблема в том, что командное окно остается открытым до тех пор, пока не закрываются окна Firefox, а это не то, что я хочу. Глядя на Process Explorer, когда я запускаю скрипт, вот что происходит:

  1. powershell.exe появляется под explorer.exe, и появляется окно Powershell (с черным фоном, как ни странно. Но это не cmd.exe, так как при отладке сообщения об ошибках скрипта отображались красным цветом).
  2. outlook.exe появляется под powershell.exe и появляется окно Outlook.
  3. firefox.exe появляется под powershell.exe и появляется окно Firefox.
  4. Второй файл firefox.exe появляется под powershell.exe, и появляется другое окно Firefox. Второй процесс Firefox затем завершается, как и ожидалось, поскольку Firefox использует только один процесс.
  5. skype.exe появляется под powershell.exe и появляется окно Skype.
  6. Процесс powershell.exe необъяснимым образом застревает, как и окно Powershell.

Если я закрою оба окна Firefox, процесс powershell.exe завершится, а окно Powershell закроется, а процессы outlook.exe и skype.exe появятся в explorer.exe, как и ожидалось.

Я подозреваю, что это как-то связано со стандартным вводом, выводом и ошибкой Firefox: я не ожидаю, что Outlook или Skype когда-либо будут выводить что-либо на консоль, но у Firefox есть параметры командной строки, которые позволяют ему это делать. Я просмотрел настройки about: config и не нашел ничего подозрительного. Наконец, если у меня уже запущен экземпляр firefox.exe (запущен с ярлыка на рабочем столе), проблема не возникает (процесс powershell.exe завершается должным образом).

Так что здесь происходит? Я собираюсь попробовать добавить -WindowStyle, скрытый в ярлык рядом (нужно закрыть этот Firefox, чтобы протестировать его), но я хочу докопаться до сути, хотя бы для того, чтобы улучшить мое понимание того, как работают консоли Windows.

2 ответа2

1

Добавление -WindowStyle hidden в Target, работает как шарм; случайное окно Powershell нигде не находится ни на панели задач, ни в Process Explorer. До сих пор не уверен, почему эта проблема возникла в первую очередь, но, по крайней мере, он делает то, что должен.

1

Вы упоминаете, что Firefox может сохранять открытыми стандартный ввод, вывод и / или ошибку. Мои собственные тесты не могли воспроизвести вашу проблему (то есть окно PowerShell закрывается независимо), но я заметил, что Firefox имеет довольно много отладочной информации.

Вы можете попробовать функции перенаправления Start-Process чтобы перенаправить стандартный вывод и ошибку в NUL (по сути, отбрасывая вывод).

Для этого просто добавьте следующие два аргумента в команду Start-Process :

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

NB. Хотя NUL существу отбрасывает вывод, PowerShell откажется использовать один и тот же «файл» как для вывода, так и для ошибки. Поскольку NUL «существует» в каждом каталоге, использование разных каталогов работает в обход этого - и мы могли бы с тем же успехом ограничить его каталогами Firefox.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .