如何在数组的多个条目上“如果”?

时间:2019-10-03 07:19:56

标签: powershell

我想知道是否有一种方法可以通过使用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")

2 个答案:

答案 0 :(得分:5)

对于精确匹配,可以使用-contains-in运算符。但是,在您的情况下,您希望对多个字符串进行部分匹配,因此我将使用正则表达式。

$startMACs = 'VCO', 'FOO', 'HOM', 'EOP', 'PCP', 'BUI', 'DML'
$pattern = ($startMACs | ForEach-Object { [Regex]::Escape($_) }) -join '|'

if ($SourceLine.MAC -match "^($pattern)") {
    ...
} else {
    ...
}

^将表达式锚定在一行的开头,因此您将获得以这些子字符串开头的匹配项。

要将表达式锚定在行的末尾(这样您将获得以子字符串结尾的匹配项),将"^($pattern)"替换为"($pattern)$"

$pattern被构造为交替形式(VCO|FOO|HOM|...),表示“匹配这些子字符串中的任何一个”(“ VCO”或“ FOO”或“ HOM”或...)。

在构建模式之前转义各个术语是为了使正则表达式中具有特殊含义的字符(例如.*)被视为文字字符。在这种情况下不是必需的(因为示例字符串中没有特殊字符),但这是一个好习惯,因此,如果有人使用包含特殊字符的值更新字符串列表,则不会发生意外情况。

答案 1 :(得分:3)

由于所有模式均以3个字母代码开头,因此一种可能性是获取目标字符串的开头并使用-in运算符与模式集合进行匹配:

$startMACs = @("VCO","FOO","HOM","EOP","PCP","BUI","DML","HDOM")

if($SourceLine.MAC.Substring(0,3) -in $startMACs) {
    # Do something
}

因此,如果$SourceLine.MACEOP123,则substring()调用将抢占EOP部分,然后将其与$startMACs中的每个条目进行比较数组,如果找到匹配项,则返回true,否则返回false-在此示例中应为true

您可以对结束模式执行类似的操作:

$endMACs = @("ADM","SAL","PLA","PLN","PLC","PLS")

if($SourceLine.MAC.Substring($SourceLine.MAC.Length - 3,3) -in $endMACs) {
    # Do something
}