Почему эта команда завершается с ошибкой при запуске с «-Hostname 127.0.0.1», но не при прямом запуске?

#powershell

#powershell

Вопрос:

Мне трудно понять, почему эти команды завершаются с ошибкой при удаленном запуске. Вот пример выполнения моей команды напрямую, через invoke-command и через invoke-command с «удаленным» хостом. Последний набор завершается с ошибкой.

 PS C:UsersguyDownloadszabbix_agent> amp; 'C:Program FilesZabbixzabbix_agentd.exe' "--start"
zabbix_agentd.exe [16608]: service [Zabbix Agent] started successfully
PS C:UsersguyDownloadszabbix_agent> $?
True
PS C:UsersguyDownloadszabbix_agent> amp; 'C:Program FilesZabbixzabbix_agentd.exe' "--stop"
zabbix_agentd.exe [20428]: service [Zabbix Agent] stopped successfully
PS C:UsersguyDownloadszabbix_agent> $?
True
PS C:UsersguyDownloadszabbix_agent> invoke-command -scriptblock { amp; "C:Program FilesZabbixzabbix_agentd.exe" "--start" }
zabbix_agentd.exe [10976]: service [Zabbix Agent] started successfully
PS C:UsersguyDownloadszabbix_agent> $?
True
PS C:UsersguyDownloadszabbix_agent> invoke-command -scriptblock { amp; "C:Program FilesZabbixzabbix_agentd.exe" "--stop" }
zabbix_agentd.exe [17096]: service [Zabbix Agent] stopped successfully
PS C:UsersguyDownloadszabbix_agent> $?
True
PS C:UsersguyDownloadszabbix_agent> invoke-command -computername 127.0.0.1 -scriptblock { amp; "C:Program FilesZabbixzabbix_agentd.exe" "--start" }
zabbix_agentd.exe [8508]: service [Zabbix Agent] started successfully
      CategoryInfo          : NotSpecified: (zabbix_agentd.e...ed successfully:String) [], RemoteException
      FullyQualifiedErrorId : NativeCommandError
      PSComputerName        : 127.0.0.1

PS C:UsersguyDownloadszabbix_agent> $?
False
PS C:UsersguyDownloadszabbix_agent> invoke-command -computername 127.0.0.1 -scriptblock { amp; "C:Program FilesZabbixzabbix_agentd.exe" "--stop" }
zabbix_agentd.exe [12384]: service [Zabbix Agent] stopped successfully
      CategoryInfo          : NotSpecified: (zabbix_agentd.e...ed successfully:String) [], RemoteException
      FullyQualifiedErrorId : NativeCommandError
      PSComputerName        : 127.0.0.1

PS C:UsersguyDownloadszabbix_agent> $?
False
PS C:UsersguyDownloadszabbix_agent> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      16299  666


PS C:UsersguyDownloadszabbix_agent>
 

Разве программа не должна выполняться точно так же? Я отмечаю, что программы по-прежнему выполняются правильно, но они каким-то образом выдают эту, казалось бы, ложную ошибку. Я не думаю, что это проблема среды.

Я также должен сказать, что если я передам параметр «—help» в zabbix_agentd.exe вместо «—start» или «—stop», кажется, работает нормально; я получаю строку, содержащую текст справки, и никаких ошибок.

РЕДАКТИРОВАТЬ: одной из потенциальных подсказок может быть то, что zabbix_agentd.exe (необъяснимо) отправляет свои сообщения об успешном завершении в stderr. Удаленный запускатель для Windows может просто интерпретировать любой такой вывод как признак сбоя и реагировать соответствующим образом. Я играю с этим, но быстрое 2> amp; 1, похоже, не решает проблему.

РЕДАКТИРОВАТЬ: вероятно, также стоит отметить, что zabbix_agentd.exe правильно возвращает 0 в случае успеха.

 PS C:UsersguyDownloadszabbix_agent> invoke-command -computername 127.0.0.1 -scriptblock { amp; "C:Program FilesZabbixzabbix_agentd.exe" "--start"; $LASTEXITCODE };
zabbix_agentd.exe [19564]: service [Zabbix Agent] started successfully
      CategoryInfo          : NotSpecified: (zabbix_agentd.e...ed successfully:String) [], RemoteException
      FullyQualifiedErrorId : NativeCommandError
      PSComputerName        : 127.0.0.1

0
PS C:UsersguyDownloadszabbix_agent>
 

Комментарии:

1. Не используйте $? для внешних исполняемых файлов.. используйте $LASTEXITCODE

2. Значения $? и $LASTEXITCODE являются второстепенными, на мой взгляд. Моя настоящая цель — попытаться понять, почему здесь вообще есть ошибка.

Ответ №1:

Казалось бы, powershell автоматически преобразует любой вывод stderr в объект ErrorRecord. Это также происходит локально, но просто не отображается как исключение:

 PS C:UsersguyDownloadszabbix_agent> amp; 'C:Program FilesZabbixzabbix_agentd.exe' "--start"
zabbix_agentd.exe [19948]: service [Zabbix Agent] started successfully
PS C:UsersguyDownloadszabbix_agent>

---

PS C:UsersguyDownloadszabbix_agent> ( amp; 'C:Program FilesZabbixzabbix_agentd.exe' "--start" 2>amp;1 ).GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     ErrorRecord                              System.Object


PS C:UsersguyDownloadszabbix_agent>
 

Я подтвердил в исходном коде Zabbix, что он просто печатает в stderr и не делает ничего более экзотического.

При удаленном запуске powershell отображает не текстовую версию, а весь объект исключения.

Итак, ошибка всегда была, но не видна как таковая.

Ответ №2:

Если вам нужно просто логическое значение, добавьте ‘return $?’ в свой блок сценариев.

 $returnedBoolean = invoke-command -computername 127.0.0.1 -scriptblock {
    amp; "C:Program FilesZabbixzabbix_agentd.exe" "--stop"
    return $?
}
$returnedBoolean