0

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 に変更することで、これを自分で修正しました。

4

1 に答える 1

0

さて、私はこの問題を解決する可能な方法を見つけました:

好ましくない結果をもたらす $hosts[$i] を返す代わりに、条件に一致する有効な $out があると仮定して、$out の __Server プロパティを返します。

これを行うためのより良い方法またはよりクリーンな方法を知っている人がいる場合は、私のゲストまでお願いします。

于 2012-06-01T06:36:23.280 に答える