powershell - 如何在数组的多个条目上 “if”?

标签 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")

最佳答案

对于完全匹配,您可以使用-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/

相关文章:

powershell 解析连接目标路径

Powershell 前景色

powershell - 使用 csv 通过 powershell 在 office 365 中分配许可证

excel - Powershell 引用 vba 项目 > microsoft excel 对象 > 本工作簿

azure - 无法从 PowerShell Azure Function 更新 Azure 事件网格合作伙伴主题

c# - 如何从 System.IO.File 调用访问 PSDrive?

powershell - 为 PowerShell 命令设置新的默认值

powershell - 通过启动进程运行 cmd.exe 但无法将命令传递给 cmd.exe

batch-file - 以管理员身份在批处理文件中运行 powershell 脚本

visual-studio - 在Powershell(文件系统)中将ASP MVC 5项目发布到本地IIS(TFS)