2014-10-01 25 views
1

我正在編寫一些自動化腳本,需要使用Ruby在遠程計算機上運行PowerShell命令。在Ruby中我有以下代碼:在Ruby中獲取PowerShell輸出

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顯然會引發錯誤(比如無法訪問機器),但輸出始終爲真。

有沒有辦法知道命令是否成功運行?

+0

PowerShell執行後檢查'$?'自動變量。 http://technet.microsoft.com/en-us/library/hh847768.aspx – mudasobwa 2014-10-01 07:00:26

回答

4

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的本身是不是一個錯誤退出,你應該看看this question

+0

所以,糾正我,如果我得到這個錯誤,但:'IO :: popen([「powershell.exe」,'寫主機「做東西」]] {| io | io.read}'應該返回''做東西''?因爲當我運行這個時,powershell肯定會運行,但是沒有任何東西被'IO :: popen'返回...... – Sancarn 2017-11-21 14:45:57

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 

我比較標準輸出爲真,但你可以把它比作任何你所需要的。 described in blog