在Powershell中检查多个Hyper-V主机以查找特定VM

在Powershell中检查多个Hyper-V主机以查找特定VM,powershell,hyper-v,Powershell,Hyper V,我正在编写一个脚本来使用。 由于我们正在使用多个Hyper-V主机,并且我们的虚拟机可以出于性能原因或其他原因更改其主机,因此我需要一个脚本来找出虚拟机在哪个主机上运行,以实现以下功能 这是我试图做到的: function IdentifyHost { param ( [parameter(Position=0, Mandatory = $true)] [ValidateNotNullOrEmpty()] $VM )

我正在编写一个脚本来使用。 由于我们正在使用多个Hyper-V主机,并且我们的虚拟机可以出于性能原因或其他原因更改其主机,因此我需要一个脚本来找出虚拟机在哪个主机上运行,以实现以下功能

这是我试图做到的:

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对象,该对象表示其VMElementName属性等于作为参数给定的VM名称的VM。 如果给VM一个代表VM的WMI对象,则两个对象的VMElementName属性相等。 如果主机上不存在VM,他将不返回任何内容。 如果存在访问问题,应该抓住它

但不知怎么的,它不起作用

我的问题是:我在代码中做错了什么?我怎样才能修好它

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


EDIT2:我自己解决了这个问题,将$hosts[$I]的返回值从脆弱的$out改为$out。u服务器

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

我没有返回产生不利结果的$hosts[$i],而是返回_服务器属性$out,假设存在与条件匹配的有效$out


如果你们中有人知道更好或更干净的方法,请告诉我的客人。

好的,我找到了一个可能的答案,其他人有更好的答案/解决方案吗?