首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell类通配符问题

Powershell类通配符问题
EN

Stack Overflow用户
提问于 2017-12-11 19:30:04
回答 3查看 286关注 0票数 0

不能用通配符来比较,我做错了什么?我只能得到:

Windows 2016 Windows 10企业x64

例如,我不能

Windows 10企业X64 1709?

怎么会这样?我也只得到两个提示,它应该给我5

$TaskSequence.name is输出 Windows 2012 R2 X64 Windows 10企业x64 USMT硬链接 Windows 10企业x64 1703 en-US Windows 2016 Windows 10企业x64 USMT完全操作系统 Windows 10企业x64 Windows 7 $ImagePackage.name is的输出 Windows 2016 x64 Windows 10企业x64

代码语言:javascript
复制
$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

            } 
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-11 21:03:58

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

代码语言:javascript
复制
Get-WmiObject -Namespace "root\SMS\site_$($SiteCode)" -Class SMS_TaskSequencePackage -ComputerName $SiteServer| where-object {$_.Name -like "*$($Task.Name)*"   }

在foreach循环中,这违背了目的,所以我刚刚添加了另一个foreach,现在它完全按照预期工作了--谢谢您的所有建议。

票数 0
EN

Stack Overflow用户

发布于 2017-12-11 19:35:22

我觉得你把事情搞得有点复杂了。我假设您的WMI调用将返回这个示例中的对象数组:

代码语言:javascript
复制
$Output = @()
$Output += $TaskSequence.Name | Where-Object { $ImagePackage.Name -like "*$_*" }
$Output += $ImagePackage.Name | Where-Object { $TaskSequence.Name -like "*$_*" }

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

编辑:让它像预期的那样工作-

代码语言:javascript
复制
Foreach ($Task in $TaskSequence)
{
    Foreach ($Image in $ImagePackage)
    { 
        If ($Task.Name -like "*$($Image.Name)*")
        {
            $Task.Name
        }
        ElseIf ($Image.Name -like "*$($Task.Name)*")
        {
            $Image.Name
        }
    }
}

每次你只输出方程的一面

票数 0
EN

Stack Overflow用户

发布于 2017-12-11 19:53:16

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

代码语言:javascript
复制
$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个结果,因为‘Windows10Enterprise x64’在这两组中都有。

编辑:,所以如果您没有看到预期的结果,我怀疑您没有考虑到空格。当您生成RegEx模式时,尝试微调您的字符串,看看这是否有区别。

代码语言:javascript
复制
$TaskPattern = ($TaskSequence.Name|%{[regex]::escape($_.Trim())}) -join '|'
$ImagePattern = ($ImagePackage.Name|%{[regex]::escape($_.Trim())}) -join '|'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47760032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档