2

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

连接到 vCenter 服务器的代码:

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

从两个 vCenter 服务器获取 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 在用户和 AllUsers 范围内设置了“Multiple”属性,因此它应该搜索所有 vCenter 服务器,但由于某种原因它无法正常工作。

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

4

1 回答 1

2

由于第一个问题(与变量命名有关)已解决,我目前怀疑该问题是由于 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
}
于 2017-01-25T15:14:58.633 回答