繁体   English   中英

Powershell Like Wildcard问题

[英]Powershell Like Wildcard issue

无法进行通配符比较工作,我做错了什么? 我只能得到:

Windows Server 2016

Windows 10企业版x64

例如,我不能

Windows 10企业版X64 1709

怎么会? 我也只有2条提示,应该给我5条提示

$TaskSequence.name输出为

Windows Server 2012 R2 X64

Windows 10企业版x64 USMT硬链接

Windows 10 Enterprise x64 1703 zh-CN

Windows Server 2016

Windows 10企业版x64 USMT完整操作系统

Windows 10企业版x64

Windows 7的

$ImagePackage.name输出是

Windows Server 2016 x64

Windows 10企业版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

            } 
        }
    }

我认为您使事情变得有些复杂。 我假设您的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
        }
    }
}

每次您只输出等式的一侧

我会提供另一个解决方案。 使用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 '|'

我真的很笨拙,有时您只需要从另一个角度看待您的代码,我在做

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

在foreach循环中,这违背了目的,所以我刚刚添加了另一个foreach,现在一切都按预期工作了-感谢您的支持

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM