我想知道是否有一种方法可以通过具有if
语句来检查下面的代码,该语句检查值是否与数组的项之一匹配...
我最终得到的代码是:
foreach ($sourceLine in $source) {
$sourceAVTrim = $sourceLine.ID.Remove(0, 1)
$sourceAV = "av" + $sourceAVTrim
if ($SourceLine.MAC -like "VCO*" -or $SourceLine.MAC -like "FOO*" -or $SourceLine.MAC -like "HOM*" -or $SourceLine.MAC -like "EOP*" -or $SourceLine.MAC -like "PCP*" -or $SourceLine.MAC -like "BUI*" -or $SourceLine.MAC -like "DML*") {
if ($SourceLine.MAC -like "*ADM" -or $SourceLine.MAC -like "*SAL" -or $SourceLine.MAC -like "*PLA" -or $SourceLine.MAC -like "*PLN" -or $SourceLine.MAC -like "*PLC" -or $SourceLine.MAC -like "*PLS") {
Write-Host "$($SourceAV) will NOT receive SMS - $($SourceLine.MAC)" -ForegroundColor Red
} else {
Write-Host "$($SourceAV) will receive SMS - $($SourceLine.MAC)" -ForegroundColor Green
}
} else {
Write-Host "$($SourceAV) will NOT receive SMS - $($SourceLine.MAC)" -ForegroundColor Red
}
}
但是,我该如何设置2个数组,并让IF根据每个条目检查我的值呢?
$startMACs = @("VCO","FOO","HOM","EOP","PCP","BUI","DML")
$endMACs = @("ADM","SAL","PLA","PLN","PLC","PLS")
最佳答案
对于完全匹配,您可以使用-contains
或-in
运算符。但是,在您的情况下,您希望部分匹配多个字符串,因此我将使用正则表达式。
$startMACs = 'VCO', 'FOO', 'HOM', 'EOP', 'PCP', 'BUI', 'DML'
$pattern = ($startMACs | ForEach-Object { [Regex]::Escape($_) }) -join '|'
if ($SourceLine.MAC -match "^($pattern)") {
...
} else {
...
}
^
将表达式 anchor 定在行的开头,因此您将获得以这些子字符串开头的匹配项。要将表达式 anchor 定在行的末尾(这样您将获得以子字符串结尾的匹配项),将
"^($pattern)"
替换为"($pattern)$"
。$pattern
构造为交替形式(VCO|FOO|HOM|...
),意思是“匹配任何这些子字符串”(“VCO”或“FOO”或“HOM”或...)。在构建模式之前转义各个术语是为了使正则表达式中具有特殊含义的字符(例如
.
或*
)被视为文字字符。在这种情况下不是必需的(因为示例字符串中没有特殊字符),但是这是一个好习惯,因此,如果有人使用包含特殊字符的值更新字符串列表,则不会发生意外情况。
关于powershell - 如何在数组的多个条目上 “if”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58214156/