我有一个脚本,该脚本将关闭电源并永久删除所有与某个前缀匹配的VM。我在测试其他自动化工具时会使用它,以便轻松重置实验室。该脚本连接到多个预定义的vCenter Server,然后获取所有VM的列表。我遇到的问题是,当我尝试关闭电源或删除VM时,它说“找不到名称为'VMNAME'的VirtualMachine”。

连接到vCenter服务器的代码:

$vcservers = @("VC1","VC2")
Connect-VIServer $vcservers

从两个vCenter Server获取VM列表的代码:
$prefix = "TEST"
ForEach ($vc in $vcservers) {
    $vms += Get-VM -Server $vc | where {$_.Name -like "$prefix*"}
}

关闭电源并删除每个VM的代码:
ForEach ($vm in $vms) {
    $vmname = $vm.name
    if ($vm.PowerState -eq "PoweredOn") {
        Stop-VM -VM $vmname -confirm:$false
        Remove-VM -VM $vmname -DeletePermanently -confirm:$false
    }
}

我已通过使用Set-PowerCLIConfiguration在Users and AllUsers范围内设置了“Multiple”属性,因此它应搜索所有vCenter Server,但由于某些原因它无法正常工作。

编辑1/25/17
更新了代码,以使$ vcservers变量一致。

最佳答案

由于第一个问题(与变量命名有关)已解决,因此我目前怀疑该问题是由于PowerCLI无法确定要实时删除虚拟机所在的VCenter。因此,您可以通过vCenter进入VCenter,而不是尝试一次针对所有vCenter运行:

$prefix = "TEST"
$vcservers = @("VC1","VC2")
ForEach ($vc in $vcservers) {
    Connect-VIServer $vc
    $vms += Get-VM -Server $vc | where {$_.Name -like "$prefix*"}

    ForEach ($vm in $vms) {
        $vmname = $vm.name
        if ($vm.PowerState -eq "PoweredOn") {
            Stop-VM -VM $vmname -confirm:$false
            Remove-VM -VM $vmname -DeletePermanently -confirm:$false
        }
    Disconnect-VIServer $vc
}

09-11 17:26