【发布时间】:2012-06-01 14:36:23
【问题描述】:
我正在编写一个脚本来使用PowerShell Management Library for Hyper-V 管理 Hyper-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 对象,表示该 VM,其 VMElementName 属性等于作为参数给出的 VM 名称。 如果给 VM 一个表示 VM 的 WMI 对象,则两个对象的 VMElementName 属性是相等的。 如果主机上不存在虚拟机,他什么也不返回。 如果有访问问题,应该抓住它。
但不知何故,它不起作用。
我的问题是:我在代码中做错了什么?我该如何解决?
编辑:函数的输出是 $hosts 数组的第一个元素的访问问题警告,然后是 $hosts 本身的第一个元素。
EDIT2:我自己修复了这个问题,将脆弱的 $hosts[$i] 的返回值更改为 $out.__Server
【问题讨论】:
-
好的,我找到了一个可能的答案,还有其他人有更好的答案/解决方案吗?
标签: powershell hyper-v