Hyper-V 用の PowerShell Management Library を使用して、Hyper-VM を管理するためのスクリプトを作成しています。複数の Hyper-V ホストを使用しており、VM はパフォーマンス上の理由やその他の理由でホストを変更できるため、次の機能のために VM が実行されているホストを見つけるスクリプトが必要です。
これはこれを達成するための私の試みでした:
function IdentifyHost
{
param
(
[parameter(Position=0, Mandatory = $true)]
[ValidateNotNullOrEmpty()]
$VM
)
[Array]$hosts=Get-VMHost
if ($hosts.count -eq 0)
{
Write-Warning "No valid hosts found."
}
for ([int]$i=0; $i -lt $hosts.count; $i++ )
{
try
{
$out = Get-VM -Name $VM -Server $hosts[$i] -ErrorAction Stop
}
catch [UnauthorizedAccessException]
{
Write-Warning "Access to $hosts[$i] denied."
}
if ($VM -is [String])
{
if ($out.VMElementName -eq $VM )
{
return $out.__SERVER
}
}
elseif ($VM.ElementName -ne $null)
{
if ($out.VMElementName -eq $VM.VMElementName)
{
return $out.__SERVER
}
}
}
Write-Warning "No Host found for $VM"
}
Get-VMHost は、ローカル エリア ネットワークで使用可能なすべての Hyper-V ホストの配列を返します。私の問題は、最初の要素に UnauthorizedAccessException がある場合は常に、関数が $hosts 配列の最初の要素を返すことです。
計画は次のとおりです。VM がホスト上に存在する場合、VMElementName プロパティがパラメーターとして指定された VM 名と等しい VM を表す WMI オブジェクトを返します。VM を表す WMI オブジェクトが VM に与えられた場合、2 つのオブジェクトの VMElementName プロパティは等しくなります。VM がホスト上に存在しない場合、彼は何も返しません。アクセスに問題がある場合は、キャッチする必要があります。
でもなぜかうまくいかない。
私の質問はこれです: コードで何が間違っていますか? どうすれば修正できますか?
編集: 関数の出力は、$hosts 配列の最初の要素と $hosts 自体の最初の要素に対するアクセス問題の警告です。
EDIT2: 戻り値を脆弱な $hosts[$i] から $out.__Server に変更することで、これを自分で修正しました。