如何在PowerShell/PowerCLI中将输出设为变量,验证VM所属网络?
问题描述
我编写了一段简单的PowerShell/PowerCLI脚本:
Connect-VIServer -Server vcsa-01a.corp.local -User administrator@vsphere.local -Password VMware1! Get-VM web-01a | Get-NetworkAdapter Get-VM web-02a | Get-NetworkAdapter Get-VM db-01a | Get-NetworkAdapter
执行后输出如下:
PS C:\my\podStatusCheck> .\TestVM.ps1 Name Port User ---- ---- ---- vcsa-01a.corp.local 443 VSPHERE.LOCAL\Administrator MacAddress : 00:50:56:a1:46:33 WakeOnLanEnabled : True NetworkName : ov-web-stretched Type : Vmxnet3 ParentId : VirtualMachine-vm-21001 Parent : web-01a Uid : /VIServer=vsphere.local\administrator@vcsa-01a.corp.local:443/VirtualMachine=VirtualMachine-vm-21001/NetworkAdapter=4000/ ConnectionState : NotConnected, GuestControl, StartConnected ExtensionData : VMware.Vim.VirtualVmxnet3 Id : VirtualMachine-vm-21001/4000 Name : Network adapter 1 MacAddress : 00:50:56:a1:07:e6 WakeOnLanEnabled : True NetworkName : ov-web-stretched Type : Vmxnet3 ParentId : VirtualMachine-vm-4019 Parent : web-02a Uid : /VIServer=vsphere.local\administrator@vcsa-01a.corp.local:443/VirtualMachine=VirtualMachine-vm-4019/NetworkAdapter=4000/ ConnectionState : NotConnected, GuestControl, StartConnected ExtensionData : VMware.Vim.VirtualVmxnet3 Id : VirtualMachine-vm-4019/4000 Name : Network adapter 1 MacAddress : 00:50:56:a1:99:0f WakeOnLanEnabled : True NetworkName : ov-db-stretched Type : Vmxnet3 ParentId : VirtualMachine-vm-4017 Parent : db-01a Uid : /VIServer=vsphere.local\administrator@vcsa-01a.corp.local:443/VirtualMachine=VirtualMachine-vm-4017/NetworkAdapter=4000/ ConnectionState : NotConnected, GuestControl, StartConnected ExtensionData : VMware.Vim.VirtualVmxnet3 Id : VirtualMachine-vm-4017/4000 Name : Network adapter 1
我希望验证虚拟机是否使用特定网络,理想逻辑如下:
If (VM web-01a.Network Name -like "ov-web-stretched") { Write-Output "The VM is is the right network" } else { Write-Output "The VM is is the wrong network" }
但不清楚如何将输出内容存入变量,以及如何调用这些变量,特此寻求帮助,希望实现判断指定VM是否使用目标网络,符合则输出成功信息,不符合则输出失败信息。
解决方案
1. 存储虚拟机网卡信息到变量
PowerCLI的Get-NetworkAdapter返回的是对象集合,直接赋值给变量即可完整保存这些信息:
# 建议用Get-Credential避免明文写密码 $cred = Get-Credential -Message "输入vCenter账号密码" Connect-VIServer -Server vcsa-01a.corp.local -Credential $cred # 把指定VM的网卡信息存入变量 $web01aNics = Get-VM web-01a | Get-NetworkAdapter $web02aNics = Get-VM web-02a | Get-NetworkAdapter $db01aNics = Get-VM db-01a | Get-NetworkAdapter
2. 单网卡VM的网络验证
如果目标虚拟机只有一块网卡,直接调用变量的NetworkName属性做判断:
$targetNetwork = "ov-web-stretched" if ($web01aNics.NetworkName -eq $targetNetwork) { Write-Output "VM web-01a 处于正确的网络: $targetNetwork" } else { Write-Output "VM web-01a 处于错误的网络,当前网络: $($web01aNics.NetworkName)" }
3. 多网卡VM的网络验证(可选)
如果虚拟机有多块网卡,可检查是否至少有一块网卡匹配目标网络:
$targetNetwork = "ov-web-stretched" $matchedNic = $web01aNics | Where-Object { $_.NetworkName -eq $targetNetwork } if ($matchedNic) { Write-Output "VM web-01a 包含目标网络: $targetNetwork" } else { $currentNets = $web01aNics.NetworkName -join ', ' Write-Output "VM web-01a 未使用目标网络,当前所有网卡网络: $currentNets" }
4. 批量验证多VM的简化脚本
如果要一次性验证多个VM和对应目标网络,用哈希表映射批量处理更高效:
# 定义VM名称与目标网络的对应关系 $vmNetworkMap = @{ "web-01a" = "ov-web-stretched" "web-02a" = "ov-web-stretched" "db-01a" = "ov-db-stretched" } foreach ($vmName in $vmNetworkMap.Keys) { $targetNet = $vmNetworkMap[$vmName] $nics = Get-VM $vmName | Get-NetworkAdapter $currentNets = $nics.NetworkName -join ', ' if ($nics.NetworkName -contains $targetNet) { Write-Output "✅ VM $vmName 验证通过: 已使用目标网络 $targetNet (当前网卡网络: $currentNets)" } else { Write-Output "❌ VM $vmName 验证失败: 未使用目标网络 $targetNet (当前网卡网络: $currentNets)" } }
注意事项
- 禁止在脚本中明文写密码,使用
Get-Credential更安全 - 多网卡场景下,可根据实际需求调整判断逻辑(比如要求所有网卡都匹配目标网络)
内容的提问来源于stack exchange,提问作者I-1
相关产品推荐
相关产品推荐

