为什么在使用“ -Hostname 127.0.0.1”运行时此命令失败,而当我直接运行它时却失败?

时间:2019-04-17 07:56:47

标签: powershell

我很难理解为什么这些命令在远程运行时会失败。这是我通过“远程”主机通过invoke-command和通过invoke-command直接执行命令的示例运行。后一组失败。

PS C:\Users\guy\Downloads\zabbix_agent> & 'C:\Program Files\Zabbix\zabbix_agentd.exe' "--start"
zabbix_agentd.exe [16608]: service [Zabbix Agent] started successfully
PS C:\Users\guy\Downloads\zabbix_agent> $?
True
PS C:\Users\guy\Downloads\zabbix_agent> & 'C:\Program Files\Zabbix\zabbix_agentd.exe' "--stop"
zabbix_agentd.exe [20428]: service [Zabbix Agent] stopped successfully
PS C:\Users\guy\Downloads\zabbix_agent> $?
True
PS C:\Users\guy\Downloads\zabbix_agent> invoke-command -scriptblock { & "C:\Program Files\Zabbix\zabbix_agentd.exe" "--start" }
zabbix_agentd.exe [10976]: service [Zabbix Agent] started successfully
PS C:\Users\guy\Downloads\zabbix_agent> $?
True
PS C:\Users\guy\Downloads\zabbix_agent> invoke-command -scriptblock { & "C:\Program Files\Zabbix\zabbix_agentd.exe" "--stop" }
zabbix_agentd.exe [17096]: service [Zabbix Agent] stopped successfully
PS C:\Users\guy\Downloads\zabbix_agent> $?
True
PS C:\Users\guy\Downloads\zabbix_agent> invoke-command -computername 127.0.0.1 -scriptblock { & "C:\Program Files\Zabbix\zabbix_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:\Users\guy\Downloads\zabbix_agent> $?
False
PS C:\Users\guy\Downloads\zabbix_agent> invoke-command -computername 127.0.0.1 -scriptblock { & "C:\Program Files\Zabbix\zabbix_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:\Users\guy\Downloads\zabbix_agent> $?
False
PS C:\Users\guy\Downloads\zabbix_agent> $PSVersionTable.PSVersion

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


PS C:\Users\guy\Downloads\zabbix_agent>

程序运行不应该完全一样吗?我注意到程序仍然可以正确执行,但是它们会以某种方式产生此看似虚假的错误。我不认为这是环境问题。

我还应该说,如果我将“ --help”选项传递给zabbix_agentd.exe而不是“ --start”或“ --stop”,它似乎可以正常工作;我得到一个显示帮助文本的字符串,没有错误。

编辑:一个潜在的线索可能是zabbix_agentd.exe(莫名其妙地)将其成功消息发送到stderr。 Windows的远程运行程序可能只是将任何此类输出解释为故障迹象,并做出相应的反应。我正在玩,但是快速的2>&1似乎无法解决问题。

编辑:可能还值得注意的是,zabbix_agentd.exe成功返回正确的0。

PS C:\Users\guy\Downloads\zabbix_agent> invoke-command -computername 127.0.0.1 -scriptblock { & "C:\Program Files\Zabbix\zabbix_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:\Users\guy\Downloads\zabbix_agent>

2 个答案:

答案 0 :(得分:-1)

powershell似乎会自动将任何stderr输出转换为ErrorRecord对象。这也发生在本地,但不会例外:

PS C:\Users\guy\Downloads\zabbix_agent> & 'C:\Program Files\Zabbix\zabbix_agentd.exe' "--start"
zabbix_agentd.exe [19948]: service [Zabbix Agent] started successfully
PS C:\Users\guy\Downloads\zabbix_agent>

---

PS C:\Users\guy\Downloads\zabbix_agent> ( & 'C:\Program Files\Zabbix\zabbix_agentd.exe' "--start" 2>&1 ).GetType()

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


PS C:\Users\guy\Downloads\zabbix_agent>

我在Zabbix源代码中确认,它只是打印到stderr,而没有做任何更奇特的事情。

远程运行时,powershell不会显示文本版本,而是显示整个异常对象。

因此,错误始终存在,但实际上并不可见。

答案 1 :(得分:-2)

如果只想使用布尔值,请添加'return $?'到您的脚本块。

$returnedBoolean = invoke-command -computername 127.0.0.1 -scriptblock {
    & "C:\Program Files\Zabbix\zabbix_agentd.exe" "--stop"
    return $?
}
$returnedBoolean
相关问题