[英]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.