对两个数组使用 -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 $_ } }
我对 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 $_ } }