0

我正在编写一个脚本来使用Hyper-V 的 PowerShell 管理库来管理 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 存在于主机上,他将返回一个 WMI 对象,表示该 VM,其 VMElementName 属性等于作为参数给出的 VM 名称。如果给 VM 一个表示 VM 的 WMI 对象,则两个对象的 VMElementName 属性是相等的。如果主机上不存在虚拟机,他什么也不返回。如果存在访问问题,则应将其捕获。

但不知何故,它不起作用。

我的问题是:我在代码中做错了什么?我该如何解决?

编辑:函数的输出是 $hosts 数组的第一个元素的访问问题警告,然后是 $hosts 本身的第一个元素。

EDIT2:我通过将脆弱的 $hosts[$i] 的返回更改为 $out.__Server 自己解决了这个问题

4

1 回答 1

0

好的,所以我找到了解决此问题的可能方法:

我没有返回产生不利结果的 $hosts[$i],而是返回 $out 的 __Server 属性,假设存在符合条件的有效 $out。

如果你们中的任何人知道这样做的更好或更清洁的方法,请通过我的客人。

于 2012-06-01T06:36:23.280 回答