Powershell喜欢通配符问题

时间:2017-12-11 19:30:05

标签: powershell wildcard

无法让这个通配符比较起作用,我做错了什么? 我只能得到:

  

Windows Server 2016

     

Windows 10 Enterprise x64

例如,我无法获得

  

Windows 10 Enterprise X64 1709?

怎么来的? 我也只得到2个提示,它应该给我5个

  

$TaskSequence.name的输出

     

Windows Server 2012 R2 X64

     

Windows 10 Enterprise x64 USMT硬链接

     

Windows 10 Enterprise x64 1703 zh-CN

     

Windows Server 2016

     

Windows 10 Enterprise x64 USMT完整操作系统

     

Windows 10 Enterprise x64

     

Windows 7

     

$ImagePackage.name的输出

     

Windows Server 2016 x64

     

Windows 10 Enterprise x64

$SiteCode = "PS1"
    $SiteServer = "SRVSCCM01"
    $TaskSequence = (Get-WmiObject -Namespace "root\SMS\site_$($SiteCode)" -Class SMS_TaskSequencePackage -ComputerName $SiteServer)
    $ImagePackage = (Get-WmiObject -Namespace "root\SMS\site_$($SiteCode)" -Class SMS_ImagePackage -ComputerName $SiteServer)
    Foreach($Task in $TaskSequence){
        Foreach($Image in $ImagePackage){ 
            if($Task.Name -like "*$($Image.Name)*" -or $Image.Name -like "*$($Task.Name)*"){ 
                $Task.name

            } 
        }
    }

3 个答案:

答案 0 :(得分:0)

我认为你过分复杂了一些事情。我假设你的WMI调用正在返回这个例子的对象数组:

$Output = @()
$Output += $TaskSequence.Name | Where-Object { $ImagePackage.Name -like "*$_*" }
$Output += $ImagePackage.Name | Where-Object { $TaskSequence.Name -like "*$_*" }

但最终,你的比较失败了,因为你的逻辑是关闭的。您在寻找通配符比较还是平等?

编辑:通过以下方式让它按预期工作 -

Foreach ($Task in $TaskSequence)
{
    Foreach ($Image in $ImagePackage)
    { 
        If ($Task.Name -like "*$($Image.Name)*")
        {
            $Task.Name
        }
        ElseIf ($Image.Name -like "*$($Task.Name)*")
        {
            $Image.Name
        }
    }
}

每次只输出等式的一边

答案 1 :(得分:0)

我会提供另一种解决方案。使用RegEx匹配,并将相反的数组作为匹配模式加入。

$SiteCode = "PS1"
$SiteServer = "SRVSCCM01"
$TaskSequence = (Get-WmiObject -Namespace "root\SMS\site_$($SiteCode)" -Class SMS_TaskSequencePackage -ComputerName $SiteServer)
$ImagePackage = (Get-WmiObject -Namespace "root\SMS\site_$($SiteCode)" -Class SMS_ImagePackage -ComputerName $SiteServer)
$TaskPattern = ($TaskSequence.Name|%{[regex]::escape($_)}) -join '|'
$ImagePattern = ($ImagePackage.Name|%{[regex]::escape($_)}) -join '|'
$TaskSequence.Name|?{$_ -match $ImagePattern}
$ImagePackage.Name|?{$_ -match $TaskPattern}

另外这可以避免嵌套循环,这可能会非常快速地失控。这实际上会得到6个结果,而不是你建议的5个结果,因为'Windows 10 Enterprise x64'都在两个集合中。

编辑:因此,如果您没有看到预期的结果,我怀疑您有空格无法解释。在生成RegEx模式时尝试修剪字符串,看看是否会产生影响。

$TaskPattern = ($TaskSequence.Name|%{[regex]::escape($_.Trim())}) -join '|'
$ImagePattern = ($ImagePackage.Name|%{[regex]::escape($_.Trim())}) -join '|'

答案 2 :(得分:0)

我真的很蠢,有时你只需要从另一个角度看你的代码,我正在做一个

Get-WmiObject -Namespace "root\SMS\site_$($SiteCode)" -Class SMS_TaskSequencePackage -ComputerName $SiteServer| where-object {$_.Name -like "*$($Task.Name)*"   }

在foreach循环中,这打破了目的,所以我只是添加了另一个foreach,现在它完全按预期运行 - 感谢您的所有sugestions