PowerShell脚本获取iDrac IP写入CSV失败问题求助
解决PowerShell脚本中iDrac IP字段提取失败的问题
问题原因
你当前脚本中「iDrac IP」字段为空,核心原因是racadm.exe getniccfg的输出是纯文本格式,不是PowerShell可直接解析的对象,因此无法用Select-Object -expandproperty "IP Address"这种对象属性访问的方式提取IP地址。
解决方案
通过文本正则匹配的方式提取IP地址,替换原脚本中「iDrac IP」字段的代码:
修改后的关键代码段
# 执行racadm命令获取iDrac配置的文本输出 $racadmOutput = Invoke-Command -ComputerName $i -ScriptBlock { racadm.exe getniccfg } # 用正则表达式匹配"IP Address:"后的IP地址 $iDracIp = if ($racadmOutput -match 'IP Address:\s+(\d+\.\d+\.\d+\.\d+)') { $matches[1] } else { "N/A" } # 将提取到的IP添加到对象中 $array | Add-Member -type NoteProperty -Name "iDrac IP" -Value $iDracIp
完整优化脚本(含性能优化)
原脚本存在重复调用WMI命令的冗余,以下是优化后的完整版本:
$logregion = "TEST" $host.ui.RawUI.WindowTitle = "IP FQDN - $logRegion" $currentdate = get-date -f yyyy-MM-dd function get_info_func { $a = Get-Content "$PSScriptRoot\servers.txt" $get_info_array = @() foreach ($i in $a){ write-host $i $array = New-Object PSObject # 一次性获取所有需要的WMI对象,减少远程调用次数 $computerSystem = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $i $networkConfig = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $i | Where-Object { $_.IPEnabled } $os = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $i $systemEnclosure = Get-WmiObject -Class WIN32_systemenclosure -ComputerName $i $array | Add-Member -type NoteProperty -Name "Name From List" -Value $i $array | Add-Member -type NoteProperty -Name "Host Name" -Value $computerSystem.dnshostname $array | Add-Member -type NoteProperty -Name "Domain" -Value $computerSystem.Domain $array | Add-Member -type NoteProperty -Name "IPAddress" -Value ([string]$networkConfig.IPAddress) $array | Add-Member -type NoteProperty -Name "IpSubnet" -Value ([string]$networkConfig.IpSubnet) $array | Add-Member -type NoteProperty -Name "DefaultIPGateway" -Value ([string]$networkConfig.DefaultIPGateway) $array | Add-Member -type NoteProperty -Name "DNSServerSearchOrder" -Value ([string]$networkConfig.DNSServerSearchOrder) $array | Add-Member -type NoteProperty -Name "Mac Address" -Value ([string]$networkConfig.MACAddress) $array | Add-Member -type NoteProperty -Name "OS" -Value $os.Caption $array | Add-Member -type NoteProperty -Name "MODEL" -Value $computerSystem.Model $array | Add-Member -type NoteProperty -Name "Serial Number" -Value $systemEnclosure.SerialNumber # 提取iDrac IP地址 $racadmOutput = Invoke-Command -ComputerName $i -ScriptBlock { racadm.exe getniccfg } $iDracIp = if ($racadmOutput -match 'IP Address:\s+(\d+\.\d+\.\d+\.\d+)') { $matches[1] } else { "N/A" } $array | Add-Member -type NoteProperty -Name "iDrac IP" -Value $iDracIp $get_info_array += $array } $get_info_array | Export-Csv "$PSScriptRoot\IPinfo_$($logregion)_$(get-date -f yyyy-MM-dd).csv" -NoTypeInformation -append } & get_info_func
说明
- 正则表达式
'IP Address:\s+(\d+\.\d+\.\d+\.\d+)'会精准匹配racadm getniccfg输出中「IP Address:」后的IP地址 - 若匹配失败(比如racadm命令执行出错),会返回「N/A」避免CSV中出现空值
- 优化后的脚本减少了重复的远程WMI调用,提升了执行效率
内容的提问来源于stack exchange,提问作者Von
相关产品推荐
相关产品推荐

