我正在编写一个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。
谢谢!
更新
我已尝试使用-ErrorAction SilentlyContinue
或设置$ErrorActionPreference
,但如果出现错误,则不会将输出存储到$move
。我仍然想要Move-VM
的输出,所以我可以检查$move
并根据不同类型的失败执行不同的逻辑。
我意识到我实际上是在尝试完成VMM的维护模式所做的事情(从主机中撤出所有虚拟机并将其迁移到集群中的其他位置)。但是,VMM 2012 SP1尝试一次迁移多个VM到/从Server 2008R2主机迁移,这些主机不能支持多于1个和更多的主机。一次移出1次。因此,迁移失败,VMM将尝试重新执行另一组迁移。从本质上讲,VMM陷入了故障循环。该脚本通过编程方式避免一次仅迁移一个VM。
答案 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