从 CBS.log 返回组件名
function ConvertFrom-CBStoComponentName
{
[CmdletBinding(DefaultParameterSetName = 'SxsSet')]
param
(
[Parameter(Mandatory = $true,
Position = 1)]
[System.String]
$line,
[Parameter(ParameterSetName = 'SxsSet')]
[Alias('p')]
[System.String]
$path,
[Parameter(ParameterSetName = 'WinnerSet')]
[Alias('w')]
[switch]
$isWinner = $false,
[Parameter(ParameterSetName = 'WinnerSet')]
[Alias('v')]
[switch]
$hasVersion = $false
)
if ($hasVersion) { $isWinner = $true }
$line -match "comp: (.*?), Version = (.*?), pA = (.*?) .*?, Culture (.*?), VersionScope = .*?, PublicKeyToken = {l:8 b:(.*?)}" | Out-Null
$sxs = $matches[1]
if ($sxs.length -gt 40) { $sxs = $sxs.Substring(0, 19) + ".." + $sxs.substring($sxs.Length - 19) }
$version = $matches[2]
$architecture = ConvertTo-ShortId $matches[3]
$culture = ConvertTo-ShortId $matches[4]
$publicKey = $matches[5]
# 对比注册表,输出 Winner
if ($isWinner)
{
$search = "$architecture`_$sxs`_$publicKey`_$culture".ToLower()
# 在 Winner 中找到
$WinnersBase = "SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\Winners"
$winners = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey($WinnersBase).GetSubKeyNames() | ? { $_ -ilike "$search`*" }
# 没有找到,再查 ComponentFamily
if (! $winners)
{
$servicingStackVersion = Get-ServicingStackVersion
$ComponentFamiliesBase = "Components\DerivedData\VersionedIndex\$servicingStackVersion`\ComponentFamilies"
$winners = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey($ComponentFamiliesBase).GetSubKeyNames() | ? { $_ -ilike "$search`*" }
}
if ($hasVersion)
{
foreach ($winner in $winners)
{
"$winner`,$version"
}
}
else
{
$winners
}
}
# 对比文件,输出 Component
else
{
$search = "$architecture`_$sxs`_$publicKey`_$version`_$culture".ToLower()
dir -path $path -Filter "$search`*" -directory -Name
}
}