2017-01-13 34 views
1

我有一個腳本可以關閉並刪除所有匹配某個前綴的虛擬機。在測試其他自動化工具以便重置實驗室時,我會使用它。腳本連接到多個預定義的vCenter服務器,然後獲取所有虛擬機的列表。我遇到的問題是,當我嘗試關閉或刪除虛擬機時,它會顯示「找不到名爲」VMNAME「的VirtualMachine。」從兩者的vCenter服務器獲取虛擬機列表PowerCLI:在多臺vCenter服務器上使用虛擬機

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

代碼:

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

代碼,關機和刪除每個虛擬機:連接到vCenter服務器

代碼

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-PowerCLIConfigu在Users和AllUsers範圍上設置了「Multiple」屬性因此它應該搜索所有vCenter服務器,但出於某種原因,它不起作用。

編輯1/25/17 已更新代碼以使$ vcservers變量保持一致。

+0

'$ vms'包含什麼?我認爲它是一個數組數組,而你期望有一組虛擬機。 – Swonkie

+0

它包含與第二個代碼塊中的搜索匹配的虛擬機列表。它是一個包含名稱,powerstate和其他屬性的數組。 – McKenning

回答

1

由於第一個問題(與變量命名有關)已解決,因此我目前懷疑問題是由於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 
} 
+0

不錯,但是這是我從原始代碼翻譯出來的錯誤。我已經更新了問題,所以變量是相同的。 – McKenning

+1

我沒有一個vcenter來測試,但再次查看您的問題,我認爲這可能是因爲當您運行Stop-VM和Remove-VM時,它不知道哪個VCenter要查看。你可以做的是在同一個ForEach循環中包含所有內容 - 包括Connect-VIServer。試試看,讓我知道它是怎麼回事。如果有效,我會把它作爲一個單獨的答案添加。 – twglomski

+0

我不確定如何在相同的ForEach循環中包含所有內容。當我沒有連接到vCenters,直到我進入foreach循環時,我怎麼能在vms上做一個循環? – McKenning

相關問題