2012-05-31 21 views
0

我正在编写一个脚本来使用PowerShell Management Library for Hyper-V来管理Hyper-VM。 由于我们正在使用多个Hyper-V主机,并且出于性能原因或其他原因,我们的虚拟机可能会更改主机,所以我需要一个脚本来查找运行虚拟机的主机是否具备以下功能。在Powershell中为特定虚拟机检查多个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" 
} 

获取-VMHOST返回所有可用的Hyper-V主机的局域网中的数组。 我的问题是,当第一个元素有一个UnauthorizedAccessException时,我的函数总是返回$ hosts数组的第一个元素。

计划如下: 如果虚拟机存在于主机上,他将返回一个WMI对象,表示该VM的VMElementName属性等于作为参数给定的VM名称。 如果向VM提供表示VM的WMI对象,则两个对象的VMElementName属性相同。 如果虚拟机在主机上不存在,则不会返回任何内容。 如果有访问问题,应该抓住它。

但不知何故,它不工作。

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

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

EDIT2:我定这个自己通过改变从脆弱$主机返回[$ i]至$出.__服务器

+0

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

回答

0

好了,所以我找到了解决这一问题的一个可行的办法:

代替返回产生不利结果的$ hosts [$ i],假设有一个符合条件的有效$ out,我返回$ out的__Server属性。

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