1

我正在编写一些自动化脚本,需要使用 Ruby 在远程机器上运行 PowerShell 命令。在 Ruby 中,我有以下代码:

def run_powershell(powershell_command)
    puts %Q-Executing powershell #{powershell_command}-
    output =  system("powershell.exe  #{powershell_command}")
    puts "Executed powershell output #{output}"
end

我可以传入基于 Invoke-Command 的 ps1 文件,一切都按预期工作。运行命令时,我可以在控制台中看到输出。

唯一的问题是无法查明命令运行是否成功;有时 PowerShell 显然会抛出错误(例如无法访问机器),但输出始终为 true。

有没有办法知道命令是否成功运行?

4

2 回答 2

6

system(...)实际上会返回一个值,说明它是否成功,而不是调用的输出。

所以你可以简单地说

success = system("powershell.exe  #{powershell_command}")
if success then
    ...
end

如果您想要输出和返回代码,您可以使用“反引号”并查询$?退出状态($?顺便说一下,与问题评论中的链接不同。)

output = `powershell.exe  #{powershell_command}`
success = $?.exitstatus == 0

如果您想要一种更可靠的方式来更好地逃避事情,我会使用IO::popen

output = IO::popen(["powershell.exe", powershell_command]) {|io| io.read}
success = $?.exitstatus == 0

如果问题是 powershell 本身没有退出并出现错误,你应该看看这个问题

于 2014-10-01T22:08:53.613 回答
1

还有另一种选择,那就是从 cmd 运行 PowerShell。这是(很难弄清楚)语法:

def powershell_output_true?()
  ps_command = "(1+1) -eq 2"
  cmd_str = "powershell -Command \" " + ps_command + " \" "
  cmd = shell_out(cmd_str, { :returns => [0] })
  if(cmd.stdout =~ /true/i)
     Chef::Log.debug "PowerShell output is true"
    return true
  else
    Chef::Log.debug "PowerShell output is false"
    return false
  end
end

我将标准输出与 true 进行比较,但您可以将其与您需要的任何内容进行比较。 博客中描述

于 2015-08-10T18:13:18.087 回答