2016-11-18 19 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の不幸な特性につながります。これは、VMを取得するとすべてのフィルタリングがクライアント側で行われるということです。一方ではワイルドカードと大文字小文字の区別をサポートできるので、これは良いことです。しかし、非常に不運な結果が1つあります。これは、1つのVMをロードするのと同じくらい時間がかかり、すべてのVMをロードするのにかかる時間がかかることです。これは、2番目の例が非常に遅いという基本的な理由です.Git-HardDiskが呼び出されるたびに、VI Toolkitはバックグラウンドで1つのマシンオブジェクトをルックアップします。

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 
} 

が注釈を追加するために、一度$のVMの上に、ループをVMをロードします。

関連する問題