2013-01-24 65 views
2

我正在編寫一個PowerShell腳本,以便使用實時遷移將VM從指定的主機中順序移出到其他羣集主機上。如何禁止PowerShell cmdlet(Move-VM)結果?

操作命令是Move-VM(或Move-SCVirtualMachine),它是VirtualMachineManager模塊的一部分。但是,當我運行此cmdlet時,它總是將結果返回到我要禁止的控制檯。我不想丟失命令返回的信息。

命令

Move-VM -VM $vmToMigrate -VMHost $destinationHost

$move = (Move-VM -VM $vmToMigrate -VMHost $destinationHost)

都將返回到控制檯的信息的命令的結果是否是成功或失敗。我的腳本包含邏輯關於如何繼續取決於$move中存儲的結果,所以我想要Move-VM的結果,我只是不希望它們回顯到控制檯。我曾嘗試

($move = (Move-VM -VM $vmToMigrate -VMHost $destinationHost)) | out-null

但沒有通過Move-VM返回的信息被捕獲; $move的值爲空。

存儲Move-VM返回的結果的最佳方式是什麼,而不完全丟棄該cmdlet的返回值,同時抑制其輸出到控制檯?我想避免讓我的腳本輸出this

謝謝!

更新:

  1. 我一直在使用-ErrorAction SilentlyContinue或設置$ErrorActionPreference試過了,但是如果有錯誤,那麼沒有輸出存儲到$move。我仍然需要輸出Move-VM,所以我可以檢查$move並根據不同類型的故障執行不同的邏輯。

  2. 我意識到我基本上試圖完成VMM的維護模式(從主機撤出所有虛擬機並將其遷移到集羣中的其他位置)。但是,VMM 2012 SP1嘗試一次將多個VM遷移到Server 2008R2主機,或者從Server 2008R2主機遷移到一臺主機,因此無法同時支持多個遷移1。因此,遷移失敗,VMM將嘗試重新執行另一組遷移。實質上,VMM陷入了失敗循環。該腳本通過編程方式避免了一次只遷移一個VM。

+0

2個問題:你不想「1/17 ...」和「虛擬機剩下的。」或者你不想該錯誤(因爲這是通過使用'-ErrorAction SilentlyContinue'。:解決的)。另外,我可以問爲什麼你不能有輸出?狀態更新不會在需要一段時間時受到傷害,並且如果您從桌面上的快捷方式運行它或作爲計劃任務運行它,則在完成任何操作時都不會看到它。 –

+0

嗨格雷默,我不想要紅色的錯誤輸出。白色文本只是我想要打印到控制檯上。我應該提到我嘗試過'-ErrorAction SilentlyContinue',但問題是如果出現錯誤,'$ move'爲空。如果發生故障,我希望能夠檢查'$ move'並根據故障類型運行邏輯。 –

+0

當我看着你的示例輸出,看起來你看到錯誤流輸出,你可以很容易地用'2> $ null'或'2> err.txt'重定向。 –

回答

2

您可能需要在呼叫來包裝命令PowerShell中,例如:

powershell -command { write-host "a" } | out-null 

$out = powershell -command { write-host "a" } 

你不會看到正在打印的a

但是當你做

write-host "a" | out-null 

你會看到a

+0

但他會得到輸出? –

+0

@Graimer - 更新了 – manojlds

+0

讓這個工作很困難。 '$ test = powershell -command {write-host「a」; $ obj = New-Object psobject -Property @ {Testprop =「Testval」}; $ obj}'不返回'$ obj'。好吧,它的確如此,但它也會輸出所有的寫入主機,所以您必須深入挖掘數組才能找到對象。 –

1

你可以輸出重定向到一個文件?只有 PS V3:

#Invalid command: 
ping -rrfrfr *> $env:temp\test.txt 
$? # last execution status will be false 

ping google.com *>> $env:temp\test.txt 
$? #true as command is valid 

$resu=gc $env:temp\test.txt 
$resu 
+0

'* >>'僅限V3。 '2>'適用於所有版本的PowerShell。 –

1

嘗試:

$move = Move-VM -VM $vmToMigrate -VMHost $destinationHost 2> err.txt 

這將正常標準輸出輸出返回$move和錯誤會被放在一個文件中。如果你對這些錯誤根本不感興趣:

$move = Move-VM -VM $vmToMigrate -VMHost $destinationHost 2> $null 
+0

真的嗎?我沒有看到這個工作。根據OP的要求,這應該起作用? '&{寫主機'一個「} 2> blah.txt'。它仍然打印一個? – manojlds

+0

OP的「Write-Host」在哪裏?請不要告訴我Move-VM正在使用寫主機。 –

+0

似乎如果'$ a = Move-VM ...'將東西返回給控制檯。 – manojlds

1

分配給變量是我如何在我的腳本中抑制不需要的輸出。如果失敗,我總是先於我的函數調用[void],就像這樣:

[void]Move-VM -VM $vmToMigrate -VMHost $destinationHost