2016-11-18 80 views
-2

以下腳本可以使用,但完成作業需要很長時間。有人可以幫助我將這個腳本轉換爲更快的方式。使用哈希表的PowerShell

$servers = Get-Content Servers.txt 
$TCount = $servers.Count 
$count = 1 
foreach ($server in $servers) { 
    Write-Host "$Count/$Tcount - $Server" -NoNewline 

    $Result = Get-VM -Name $server | Set-Annotation -CustomAttribute "SNAP" -Value "True" 

    if ($Result.Value -eq "true") { 
     Write-Host "`t - Success" -fore "green" 
    } else { 
     Write-Host "`t - Failed" -fore "Red" 
    } 

    $count = $Count +1 
} 
+1

爲什麼你認爲散列表是相關的? – vonPryz

+0

不確定,只是得到了一些文件說,散列表執行得更好。 – rpr

+1

很確定散列表不會加快速度。這裏的延遲很可能與Get-VM從遠程服務器檢索虛擬機列表所花費的時間有關。 – Asnivor

回答

0

這怎麼可能像GET-硬盤來-VM 「myVM」 在所有的工作?畢竟,「myVM」是一個字符串,而不是一個VirtualMachine,所以不應該失敗嗎?

這樣做的原因是因爲VI Toolkit利用了PowerShell的一項功能,可以讓您在命令行上轉換您收到的參數。這就是我們稱之爲VI Toolkit的「Object By Name」功能的基礎:如果您指定了一個對象應該在的字符串,VI Toolkit將在後臺工作,將該字符串替換爲該字符串所代表的對象。

這個查找不可避免地有成本,問題是成本是多少?這給我們帶來了VI Toolkit的一個相當不幸的屬性,那就是當你得到一個虛擬機時,所有的過濾都是在客戶端完成的。一方面這很好,因爲它使我們能夠支持通配符和不區分大小寫。然而,有一個非常不幸的後果,那就是加載一個虛擬機所花費的時間與加載所有虛擬機所花費的時間一樣長(更多關於我們如何改進這一點)。這是第二個例子非常慢的基本原因:每次調用Get-HardDisk時,VI Toolkit都會在幕後查找一個機器對象。

http://blogs.vmware.com/PowerCLI/2009/03/why-is-my-code-so-slow.html

嘗試:

$servers = Get-Content Servers.txt 
$VMs = Get-VM | Where-Object {$_.Name -in $servers} 

$TCount = $servers.Count 
$count = 1 
foreach ($vm in $VMs) 
{ 
    Write-Host "$Count/$Tcount - $Server" -NoNewline 

    $Result = $vm | Set-Annotation -CustomAttribute "SNAP" -Value "True" 

    if ($Result.Value -eq "true") { 
     Write-Host "`t - Success" -fore "green" 
    } else { 
     Write-Host "`t - Failed" -fore "Red" 
    } 

    $count = $Count +1 
} 

加載虛擬機一次,然後循環在$虛擬機添加註釋。