使用脚本移动 Hyper-V VM 时遇到问题

Having trouble with a script to move Hyper-V VM's

我正在尝试编写一个脚本,它将 hyper-V 主机作为输入以及我要移动的 VM 列表的搜索字符串...这都是通过 SCCM VMM 及其所有 2012R2

这是我目前所知道的...

$VMHOST = read-host "Enter the HyperV host you want to move your VM's to"

$SEARCHPATTERN = read-host "Enter the search pattern for the VM's you want to move"

$VMLIST = Get-SCVirtualMachine | Where-Object {$_.Name -like "*$SEARCHPATTERN*"} |format-table name -HideTableHeaders

foreach ($VMM in $VMLIST)
{

Move-SCVirtualMachine -VM $VMM -VMHost $VMHOST

}

如果我 运行 它,我得到...

Move-SCVirtualMachine : Cannot bind parameter 'VM'. Cannot convert the "Microsoft.PowerShell.Commands.Internal.Format.FormatEndData" value of type "Microsoft.PowerShell.Commands.Internal.Format.FormatEndData" to type "Microsoft.SystemCenter.VirtualMachineManager.VM". At C:\Users\jfalcon\Desktop\vmmove.ps1:6 char:27 + Move-SCVirtualMachine -VM $VMM -VMHost $VMHOST + ~~~~ + CategoryInfo : InvalidArgument: (:) [Move-SCVirtualMachine], ParameterBindingException + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.SystemCenter.VirtualMachineManager.Cmdlets.DeployVMCmdlet

有什么想法吗? $VMLIST 输出格式不正确吗?

从不 如果您打算继续处理数据,请使用 format-anything。人们将它用于 "nice" 输出到文本文件(如果您喜欢控制台表),但它仅用于外观。 PowerShell 已将您的对象转换为 [Microsoft.PowerShell.Commands.Internal.Format.FormatEndData] 以便在屏幕上显示。那时原始对象被销毁。

如果您的 PowerShell 版本至少为 3.0,您需要使用 Select-Object -ExpandpropertyGet-SCVirtualMachine 中提取正确的 属性,仅使用点符号。

$VMLIST = Get-SCVirtualMachine | 
    Where-Object {$_.Name -like "*$SEARCHPATTERN*"} | 
    Select-Object -ExpandProperty Name

这应该可以解决问题。