You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:15:05