从 UninstallString 中提取 GUID
Extract GUID from UninstallString
我想了解安装在 Windows 系统上的任何软件(或者至少是在 Windows 中自行注册的所有软件)。
使用 Powershell,我能够将数据提取到 gridview 中,然后在过滤到 csv 文件后。
为此,我使用以下代码:
### Extract x64 registered programs. Excluding KB updates
$data = dir HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall |
where {$_.name -notmatch '(\.)?KB\d+'} -pv p |
Get-ItemProperty |
Where {$_.displayname -notmatch "KB\d{5,}"} |
Select @{Name="Path";Expression={$p.name}},Displayname,DisplayVersion,InstallDate,UninstallString
;
### Extract and append to $data the x86 registered programs. Excluding KB updates
$data += dir HKLM:\SOFTWARE\Wow6432Node\Micsosoft\Windows\CurrentVersion\Uninstall |
where {$_.name -notmatch '(\.)?KB\d+'} -pv p |
Get-ItemProperty |
Where {$_.displayname -notmatch "KB\d{5,}"} |
Select @{Name="Path";Expression={$p.name}},DisplayName,DisplayVersion,InstallDate,UninstallString
;
### Acces $data and output to a gridview and further to csv.
$data |
select-Object DisplayName,DisplayVersion,InstallDate,UninstallString |
sort-object -Property DisplayName |
out-gridview -PassTHru |
export-csv -delimiter "," -Path C:\temp\software.csv
示例输出如下所示:
DisplayName DisplayVersion InstallDate UninstallString
7-Zip 9.20 (x64 edition) 9.20.00.0 20190827 MsiExec.exe /I{23170F69-40C1-2702-0920-000001000000}
QGIS 3.4.13 'Madeira' 03.04.2013 C:\Program Files\QGIS 3.4\uninstall.exe
Microsoft Office Access ... 14.0.7015. 20190827 MsiExec.exe /X{90140000-0015-0407-0000-0000000FF1CE}
Realtek Card Reader 10.0.10125.... 20190827 "C:\Program Files (x86)\InstallShield Installation Information\{5BC2B5AB-80DE-4E83-B8CF-426902051D0A}\setup.exe" -runfromtemp -removeonly
为了进一步处理,我想附加一个列,其中从 UninstallString 中提取 GUID(如果存在)。示例:
DisplayName DisplayVersion InstallDate GUID UninstallString
7-Zip 9.20 (x64 edition) 9.20.00.0 20190827 23170F69-40C1-2702-0920-000001000000 MsiExec.exe /I{23170F69-40C1-2702-0920-000001000000}
QGIS 3.4.13 'Madeira' 03.04.2013 C:\Program Files\QGIS 3.4\uninstall.exe
Microsoft Office Access ... 14.0.7015. 20190827 90140000-0015-0407-0000-0000000FF1CE MsiExec.exe /X{90140000-0015-0407-0000-0000000FF1CE}
Realtek Card Reader 10.0.10125.... 20190827 5BC2B5AB-80DE-4E83-B8CF-426902051D0A "C:\Program Files (x86)\InstallShield Installation Information\{5BC2B5AB-80DE-4E83-B8CF-426902051D0A}\setup.exe" -runfromtemp -removeonly
我知道我必须以某种方式使用 RegEx 代码来完成它,但我无法继续进行。
有人可以帮助我吗?谢谢
您可以使用正则表达式 -match
从 UninstallString 中提取 GUID,并将其作为计算的 属性 添加到 Select-Object
:
$reGuid = '\{?(([0-9a-f]){8}-([0-9a-f]){4}-([0-9a-f]){4}-([0-9a-f]){4}-([0-9a-f]){12})\}?'
$data | Select-Object DisplayName,DisplayVersion,InstallDate,
@{Name = 'GUID'; Expression = { if ($_.UninstallString -match $reGuid) {$matches[1]}} },
UninstallString |
Sort-Object -Property DisplayName |
Out-GridView -PassThru |
Export-Csv -Delimiter "," -Path 'C:\temp\software.csv' -NoTypeInformation
正则表达式详细信息:
\{ Match the character “{” literally
? Between zero and one times, as many times as possible, giving back as needed (greedy)
( Match the regular expression below and capture its match into backreference number 1
( Match the regular expression below and capture its match into backreference number 2
[0-9a-f] Match a single character present in the list below
A character in the range between “0” and “9”
A character in the range between “a” and “f”
){8} Exactly 8 times
- Match the character “-” literally
( Match the regular expression below and capture its match into backreference number 3
[0-9a-f] Match a single character present in the list below
A character in the range between “0” and “9”
A character in the range between “a” and “f”
){4} Exactly 4 times
- Match the character “-” literally
( Match the regular expression below and capture its match into backreference number 4
[0-9a-f] Match a single character present in the list below
A character in the range between “0” and “9”
A character in the range between “a” and “f”
){4} Exactly 4 times
- Match the character “-” literally
( Match the regular expression below and capture its match into backreference number 5
[0-9a-f] Match a single character present in the list below
A character in the range between “0” and “9”
A character in the range between “a” and “f”
){4} Exactly 4 times
- Match the character “-” literally
( Match the regular expression below and capture its match into backreference number 6
[0-9a-f] Match a single character present in the list below
A character in the range between “0” and “9”
A character in the range between “a” and “f”
){12} Exactly 12 times
)
\} Match the character “}” literally
? Between zero and one times, as many times as possible, giving back as needed (greedy)
您可能更喜欢使用 get-package:
get-package | select -first 5
Name Version Source ProviderName
---- ------- ------ ------------
Windows Driver Package - Ci... 02/14/2014 6.... Programs
Wolfram Extras 11.0 (5570611) 11.0.0 Programs
ArcGIS Desktop Background G... 10.5.6491 Programs
ArcGIS Desktop Background G... 10.5.6491 C:\Program Files (x86)\ArcGIS... msi
Conexant HD Audio 8.65.186.3 Programs
get-package | % { $_.metadata['uninstallstring'] }
顺便说一句,如果您安装了 Netbeans,它会导致 get-itemproperty 崩溃。
我想了解安装在 Windows 系统上的任何软件(或者至少是在 Windows 中自行注册的所有软件)。 使用 Powershell,我能够将数据提取到 gridview 中,然后在过滤到 csv 文件后。 为此,我使用以下代码:
### Extract x64 registered programs. Excluding KB updates
$data = dir HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall |
where {$_.name -notmatch '(\.)?KB\d+'} -pv p |
Get-ItemProperty |
Where {$_.displayname -notmatch "KB\d{5,}"} |
Select @{Name="Path";Expression={$p.name}},Displayname,DisplayVersion,InstallDate,UninstallString
;
### Extract and append to $data the x86 registered programs. Excluding KB updates
$data += dir HKLM:\SOFTWARE\Wow6432Node\Micsosoft\Windows\CurrentVersion\Uninstall |
where {$_.name -notmatch '(\.)?KB\d+'} -pv p |
Get-ItemProperty |
Where {$_.displayname -notmatch "KB\d{5,}"} |
Select @{Name="Path";Expression={$p.name}},DisplayName,DisplayVersion,InstallDate,UninstallString
;
### Acces $data and output to a gridview and further to csv.
$data |
select-Object DisplayName,DisplayVersion,InstallDate,UninstallString |
sort-object -Property DisplayName |
out-gridview -PassTHru |
export-csv -delimiter "," -Path C:\temp\software.csv
示例输出如下所示:
DisplayName DisplayVersion InstallDate UninstallString
7-Zip 9.20 (x64 edition) 9.20.00.0 20190827 MsiExec.exe /I{23170F69-40C1-2702-0920-000001000000}
QGIS 3.4.13 'Madeira' 03.04.2013 C:\Program Files\QGIS 3.4\uninstall.exe
Microsoft Office Access ... 14.0.7015. 20190827 MsiExec.exe /X{90140000-0015-0407-0000-0000000FF1CE}
Realtek Card Reader 10.0.10125.... 20190827 "C:\Program Files (x86)\InstallShield Installation Information\{5BC2B5AB-80DE-4E83-B8CF-426902051D0A}\setup.exe" -runfromtemp -removeonly
为了进一步处理,我想附加一个列,其中从 UninstallString 中提取 GUID(如果存在)。示例:
DisplayName DisplayVersion InstallDate GUID UninstallString
7-Zip 9.20 (x64 edition) 9.20.00.0 20190827 23170F69-40C1-2702-0920-000001000000 MsiExec.exe /I{23170F69-40C1-2702-0920-000001000000}
QGIS 3.4.13 'Madeira' 03.04.2013 C:\Program Files\QGIS 3.4\uninstall.exe
Microsoft Office Access ... 14.0.7015. 20190827 90140000-0015-0407-0000-0000000FF1CE MsiExec.exe /X{90140000-0015-0407-0000-0000000FF1CE}
Realtek Card Reader 10.0.10125.... 20190827 5BC2B5AB-80DE-4E83-B8CF-426902051D0A "C:\Program Files (x86)\InstallShield Installation Information\{5BC2B5AB-80DE-4E83-B8CF-426902051D0A}\setup.exe" -runfromtemp -removeonly
我知道我必须以某种方式使用 RegEx 代码来完成它,但我无法继续进行。 有人可以帮助我吗?谢谢
您可以使用正则表达式 -match
从 UninstallString 中提取 GUID,并将其作为计算的 属性 添加到 Select-Object
:
$reGuid = '\{?(([0-9a-f]){8}-([0-9a-f]){4}-([0-9a-f]){4}-([0-9a-f]){4}-([0-9a-f]){12})\}?'
$data | Select-Object DisplayName,DisplayVersion,InstallDate,
@{Name = 'GUID'; Expression = { if ($_.UninstallString -match $reGuid) {$matches[1]}} },
UninstallString |
Sort-Object -Property DisplayName |
Out-GridView -PassThru |
Export-Csv -Delimiter "," -Path 'C:\temp\software.csv' -NoTypeInformation
正则表达式详细信息:
\{ Match the character “{” literally ? Between zero and one times, as many times as possible, giving back as needed (greedy) ( Match the regular expression below and capture its match into backreference number 1 ( Match the regular expression below and capture its match into backreference number 2 [0-9a-f] Match a single character present in the list below A character in the range between “0” and “9” A character in the range between “a” and “f” ){8} Exactly 8 times - Match the character “-” literally ( Match the regular expression below and capture its match into backreference number 3 [0-9a-f] Match a single character present in the list below A character in the range between “0” and “9” A character in the range between “a” and “f” ){4} Exactly 4 times - Match the character “-” literally ( Match the regular expression below and capture its match into backreference number 4 [0-9a-f] Match a single character present in the list below A character in the range between “0” and “9” A character in the range between “a” and “f” ){4} Exactly 4 times - Match the character “-” literally ( Match the regular expression below and capture its match into backreference number 5 [0-9a-f] Match a single character present in the list below A character in the range between “0” and “9” A character in the range between “a” and “f” ){4} Exactly 4 times - Match the character “-” literally ( Match the regular expression below and capture its match into backreference number 6 [0-9a-f] Match a single character present in the list below A character in the range between “0” and “9” A character in the range between “a” and “f” ){12} Exactly 12 times ) \} Match the character “}” literally ? Between zero and one times, as many times as possible, giving back as needed (greedy)
您可能更喜欢使用 get-package:
get-package | select -first 5
Name Version Source ProviderName
---- ------- ------ ------------
Windows Driver Package - Ci... 02/14/2014 6.... Programs
Wolfram Extras 11.0 (5570611) 11.0.0 Programs
ArcGIS Desktop Background G... 10.5.6491 Programs
ArcGIS Desktop Background G... 10.5.6491 C:\Program Files (x86)\ArcGIS... msi
Conexant HD Audio 8.65.186.3 Programs
get-package | % { $_.metadata['uninstallstring'] }
顺便说一句,如果您安装了 Netbeans,它会导致 get-itemproperty 崩溃。