#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