Удаленный запуск процесса в Powershell, получение% ERRORLEVEL% в Windows - PullRequest
4 голосов
/ 14 марта 2011

Немного фона:

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

Мои проблемы:

  1. logman не может запускать или останавливать счетчики на машинах с более поздней версией ОС.
  2. psexec может использоваться для удаленного запуска logman, но psexec любит периодически зависать при запуске из тестовой среды. Он работает нормально вручную из командной строки. Я предполагаю, что это потому, что вызывающий процесс не предоставляет консоль или подобную неловкость. Я мало что могу с этим поделать (GRRRR)
  3. Я написал сценарий PowerShell, который выполняет logman удаленно, используя WMI win32_process, и вызвал его из пакетного сценария, это прекрасно работает. Тем не менее, тестовая среда решает сценарии прохождения и неудачи на основе %ERRORLEVEL% и содержимого stderr, но WMI win32_process также не дает мне доступа. Поэтому, если счетчики не запустятся, тест все равно будет пахать и тратить время каждого.

Я ищу решение, которое позволило бы мне выполнить программу на удаленном компьютере, проверить код возврата программы и / или pipe stderr обратно вызывающей стороне. По причинам простоты это должно быть написано в инструментах, которые доступны на ванильной коробке Win2k3. Я действительно предпочел бы не использовать сложную коллекцию сценариев, которые записывают данные в файлы журналов, а затем читают их снова.

Кто-нибудь имел подобную проблему и решил ее, или, по крайней мере, есть предложение?

1 Ответ

9 голосов
/ 14 марта 2011

Из соображений простоты быть написанным на инструментах, которые доступны на ванильной коробке Win2k3. Я бы на самом деле предпочитаю не использовать запутанный коллекция скриптов, которые сбрасывают вещи в лог-файлы, а затем читая их обратно снова.

PowerShell не является родным инструментом в Windows 2003. Вы все еще хотите пометить этот вопрос PowerShell и искать ответ? В любом случае, я дам вам ответ PowerShell.

$proc = Invoke-WmiMethod -ComputerName Test -Class Win32_Process -Name Create -ArgumentList "Notepad.exe"
Register-WmiEvent -ComputerName test -Query "Select * from Win32_ProcessStopTrace Where ProcessID=$($proc.ProcessId)" -Action { Write-Host "Process ExitCode: $($event.SourceEventArgs.NewEvent.ExitStatus)" }

Для этого требуется PowerShell 2.0 в системе, где вы запускаете эти скрипты. Ваша удаленная система Windows 2003 не нуждается в PowerShell.

PS: Если вам нужен ускоренный курс по WMI и PowerShell, прочитайте мой eGuide: Язык запросов WMI через PowerShell

...