对两个数组使用 -like 运算符

Using -like operator with two arrays

我对 PowerShell 中的 -like 运算符有疑问。

脚本编写于

PSVersion                      5.0.10240.17146
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   10.0.10011.16384
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3

我有以下变量。

$ProgramVar

这个变量可以包含示例;

Microsoft VisualStudio JavaScript Project System
Java 7 Update 80
Java 8 Update 111
Microsoft VisualStudio JavaScript Language Service
Java Auto Updater

我有另一个名为 $Exclusions 的变量

$Exclusions = @("*Microsoft Corporation*","*Microsoft*","*SAP BusinessObjects*","*Hewlett-Packard*","*JavaCard*","*Development*")

我需要比较 $ProgramVar 中的每个 $program 并查看 $program 是否与任何 $exclusion 相似。我已经用几种不同的方式写了它,但我想不出正确的方法。我已经删除了我尝试过的大部分内容,但这是我目前所在的位置..

foreach($instance in $Programvar)
{

    if($instance -eq $Null) #<---- Dummy Check.
    {
        Write-Host "I is blank"
    }
    else
    {
        foreach($ex in $Exclusions)
        {
            #$count = 0
            #$exclusion = $Exclusions.Get($count)
            if($instance -like $ex)
            {
                Write-Host "A substring in $instance matches $ex.. Removing from array "                     
            }
            else
            {
                Write-Host "$instance does not contain $ex Substring"
            }

        }
    }
}

我认为这可行,但尚未完全测试。我想知道是否有更清洁或更快捷的方法。

编辑:

支持 JPBlanc 回答我的问题。我已经完成并使其更容易阅读。这是我最终得到的结果,以便其他人可以轻松实现代码。 JPBlanc 的解决方案会起作用,但就像我说的,我喜欢它有点冗长,这样我就可以看到它在做什么。

    $ExclusionTester = $Programvar | % `
    {
        Write-Host "Testing Exclusions: $Exclusions"
        Write-Host "$programvar"
        $ExclusionsExtracted=@() #<--- Blank array
    }`
    {
        $Program=$_; $Exclusions | % `
            {

                if ($Program -like $_) #<---- $_ Current exclusion
                    { 
                        $ExclusionsExtracted +=$Program #<---- Adding exclusion to array
                        write-host "A substring in $Program Matches $_" -ForegroundColor green
                        Write-Host "Removing $Program from ProgramVar array" -ForegroundColor Cyan
                    }

                    #Uncomment the below line to possibly rebun?
                    <#
                    else
                    {
                        Write-Host "No Substring in $t Matches $_" -ForegroundColor Yellow
                    } #>
            }
    }`
    {
        $ExclusionsExtracted #<---- End result after testing.
        $programvar = $programvar | where {$ExclusionsExtracted -notcontains $_}
    } 

再次感谢

根据 $a 包含字符串而 $e 包含排除项的事实:

$a = "Microsoft VisualStudio JavaScript Project System","Java 7 Update 80","Java 8 Update 111","Microsoft VisualStudio JavaScript Language Service","Java Auto Updater"
$e = "*Microsoft Corporation*","*Microsoft*","*SAP BusinessObjects*","*Hewlett-Packard*","*JavaCard*","*Development*"

这一行给出了要排除的字符串:

$a | % {$r=@()}{$t=$_; $e | % {if ($t -like $_){$r+=$t}}}{$r}

$r :要排除的字符串选项卡(return 值)。

$t : 包含要评估的当前字符串的临时变量。

最后你可以得到一个新标签:

$tabres = $a | where {$r -notcontains $_}

试试这样的东西

$ProgramVar = "Microsoft VisualStudio JavaScript Project System","Java 7 Update 80","Java 8 Update 111","Microsoft VisualStudio JavaScript Language Service","Java Auto Updater"
$Exclusion = "*Microsoft Corporation*","*Microsoft*","*SAP BusinessObjects*","*Hewlett-Packard*","*JavaCard*","*Development*"

$ProgramVar | where {$Prog=$_; $Exclusion | where {$Prog -like $_ } }