不能用通配符来比较,我做错了什么?我只能得到:
Windows 2016 Windows 10企业x64
例如,我不能
Windows 10企业X64 1709?
怎么会这样?我也只得到两个提示,它应该给我5
$TaskSequence.nameis的输出 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.nameis的输出 Windows 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
}
}
}发布于 2017-12-11 21:03:58
我真的很有学问,有时候你只需要从另一个角度看你的代码,我在做一个
Get-WmiObject -Namespace "root\SMS\site_$($SiteCode)" -Class SMS_TaskSequencePackage -ComputerName $SiteServer| where-object {$_.Name -like "*$($Task.Name)*" }在foreach循环中,这违背了目的,所以我刚刚添加了另一个foreach,现在它完全按照预期工作了--谢谢您的所有建议。
发布于 2017-12-11 19:35:22
我觉得你把事情搞得有点复杂了。我假设您的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
}
}
}每次你只输出方程的一面
发布于 2017-12-11 19:53:16
我会提供另一种解决方案。使用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个结果,因为‘Windows10Enterprise x64’在这两组中都有。
编辑:,所以如果您没有看到预期的结果,我怀疑您没有考虑到空格。当您生成RegEx模式时,尝试微调您的字符串,看看这是否有区别。
$TaskPattern = ($TaskSequence.Name|%{[regex]::escape($_.Trim())}) -join '|'
$ImagePattern = ($ImagePackage.Name|%{[regex]::escape($_.Trim())}) -join '|'https://stackoverflow.com/questions/47760032
复制相似问题