如何取消PowerShell cmdlet(Move-VM)结果?

时间:2013-01-24 18:20:02

标签: powershell hyper-v

我正在编写一个PowerShell脚本,以便使用实时迁移将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的值为null。

存储Move-VM返回的结果的最佳方法是什么,而不完全丢弃cmdlet返回的内容,同时抑制其输出到控制台?我想避免让我的脚本输出this

谢谢!

更新

  1. 我已尝试使用-ErrorAction SilentlyContinue或设置$ErrorActionPreference,但如果出现错误,则不会将输出存储到$move。我仍然想要Move-VM的输出,所以我可以检查$move并根据不同类型的失败执行不同的逻辑。

  2. 我意识到我实际上是在尝试完成VMM的维护模式所做的事情(从主机中撤出所有虚拟机并将其迁移到集群中的其他位置)。但是,VMM 2012 SP1尝试一次迁移多个VM到/从Server 2008R2主机迁移,这些主机不能支持多于1个和更多的主机。一次移出1次。因此,迁移失败,VMM将尝试重新执行另一组迁移。从本质上讲,VMM陷入了故障循环。该脚本通过编程方式避免一次仅迁移一个VM。

4 个答案:

答案 0 :(得分:2)

您可能希望在对powershell的调用中包装该命令,例如:

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

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

您将看不到正在打印的a

但是当你做的时候

write-host "a" | out-null

您会看到a

答案 1 :(得分: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

答案 2 :(得分:1)

尝试:

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

这会将正常的stdout输出返回到$move,错误将被放入文件中。如果您根本不对错误感兴趣,那么:

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

答案 3 :(得分:1)

分配给变量是我如何在脚本中抑制不需要的输出。如果失败,我总是在[void]的函数调用之前,如下所示:

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