Powershell Like 通配符问题
Powershell Like Wildcard issue
无法进行通配符比较,我哪里做错了?
我只能得到:
Windows Server 2016
Windows 10 Enterprise x64
例如,我无法得到
Windows 10 Enterprise X64 1709 ?
怎么会?
我也只得到 2 个提示,它应该给我 5
Output of $TaskSequence.name
is
Windows Server 2012 R2 X64
Windows 10 Enterprise x64 USMT Hardlinks
Windows 10 Enterprise x64 1703 en-US
Windows Server 2016
Windows 10 Enterprise x64 USMT Full OS
Windows 10 Enterprise x64
Windows 7
Output of $ImagePackage.name
is
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
}
}
}
我认为你把事情复杂化了一点。我假设您的 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,现在一切都按预期完美运行 - 感谢您的所有建议
无法进行通配符比较,我哪里做错了? 我只能得到:
Windows Server 2016
Windows 10 Enterprise x64
例如,我无法得到
Windows 10 Enterprise X64 1709 ?
怎么会? 我也只得到 2 个提示,它应该给我 5
Output of
$TaskSequence.name
isWindows Server 2012 R2 X64
Windows 10 Enterprise x64 USMT Hardlinks
Windows 10 Enterprise x64 1703 en-US
Windows Server 2016
Windows 10 Enterprise x64 USMT Full OS
Windows 10 Enterprise x64
Windows 7
Output of
$ImagePackage.name
isWindows 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
}
}
}
我认为你把事情复杂化了一点。我假设您的 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,现在一切都按预期完美运行 - 感谢您的所有建议