PowerShell中使用-contains检测数组内指定字符串失败求助
问题描述
我编写了如下PowerShell代码:
$Packets = @() $Packets += Test-PXESever -ProcessorArchitecture 0 -Verbose $Packets += Test-PXESever -ProcessorArchitecture 7 -Verbose
数组$Packets的输出内容如下:
Op : BootResponse HType : Ethernet HLen : 6 Hops : 0 XID : E72347EB Secs : 0 Flags : {Broadcast} CIAddr : 0.0.0.0 SIAddr : 10.164.28.3 SName : File : Op : BootResponse HType : Ethernet HLen : 6 Hops : 0 XID : E72347EB Secs : 0 Flags : {Broadcast} CIAddr : 10.164.28.74 SIAddr : 164.3.15.61 File : smsboot\Ps02\x86\pxe.com
我需要检查$Packets数组中是否包含字符串smsboot和164.3.15.61,从输出来看确实存在,但使用以下代码检测时始终返回“不包含”:
if($Packets -contains "smsboot"){ Write-Host "Contains smsboot"} else {Write-Host "Does not contain smsboot"}
针对IP地址的检测也是同样情况,请问我哪里操作错误了?
问题原因与解决方法
错误原因
-contains运算符在PowerShell中是检测数组是否存在完全匹配的元素,但你的$Packets数组里的元素是自定义对象(不是字符串),每个对象包含Op、SIAddr、File等属性,直接拿字符串和数组对象对比自然不匹配。
解决方法
需要针对对象的具体属性做检测:
- 检测
smsboot(对应File属性)
可以直接提取所有对象的File属性,用-match做模糊匹配:
if ($Packets.File -match "smsboot") { Write-Host "Contains smsboot" } else { Write-Host "Does not contain smsboot" }
或者更严谨地遍历过滤:
$hasSmsboot = $Packets | Where-Object { $_.File -like "*smsboot*" } | Select-Object -First 1 if ($hasSmsboot) { Write-Host "Contains smsboot" } else { Write-Host "Does not contain smsboot" }
- 检测
164.3.15.61(对应SIAddr属性)
提取所有对象的SIAddr属性后,用-contains做精确匹配:
if ($Packets.SIAddr -contains "164.3.15.61") { Write-Host "Contains 164.3.15.61" } else { Write-Host "Does not contain 164.3.15.61" }
如果需要模糊匹配IP(比如匹配网段),同样用-match:
if ($Packets.SIAddr -match "164\.3") { Write-Host "Contains IP in 164.3 segment" }
内容的提问来源于stack exchange,提问作者user18209625
相关产品推荐
相关产品推荐

