首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从UninstallString中提取GUID

从UninstallString中提取GUID
EN

Stack Overflow用户
提问于 2020-02-13 14:54:32
回答 2查看 791关注 0票数 3

我想对安装在Windows系统上的任何软件进行概述(或者至少在Windows中注册自己的所有软件)。使用Powershell,我能够将数据提取到一个网格视图中,并将数据过滤到一个csv文件中。为此,我使用以下代码:

代码语言:javascript
复制
### 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

输出示例如下所示:

代码语言:javascript
复制
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

为了进行进一步的处理,我想附加一个列,其中GUID (如果它存在)是从UninstallString中提取的。示例:

代码语言:javascript
复制
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代码来做这件事,但是我不能再继续下去了。有人能帮我吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-13 15:07:24

可以使用regex UninstallString从-match中提取GUID,并将其作为计算的属性添加到Select-Object中。

代码语言:javascript
复制
$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

Regex详细信息:

{匹配字符{{“字面意思?在0到1倍之间,尽可能多次,按需要返回(贪婪)(匹配下面的正则表达式并将其匹配捕获为反向引用编号1(匹配下面的正则表达式并将其匹配到反向引用号2 0-9a-f )匹配列表中的单个字符,该字符位于“0”和“9”之间的范围内。“和”f“){8}精确8次-匹配字符”-“字面意思是(匹配下面的正则表达式并将其匹配到反向引用号3 0-9a-f中匹配”0“和”9“范围内A字符下面的列表中的单个字符。一个字符在“a”和“f”之间的范围内,{4}正好4次-匹配该字符“字面意思是”(匹配下面的正则表达式并将其匹配到反向引用号4 0-9a-f )匹配列表中的单个字符,列表中的字符位于“0”和“9”之间。一个字符在“a”和“f”之间的范围内,{4}正好4次-匹配该字符“字面意思是”(匹配下面的正则表达式并将其匹配到反向引用号5 0-9a-f )匹配列表中的单个字符,列表中的字符位于“0”范围内的A字符下面。和“9”字符在“a”和“f”之间的范围内,{4}正好4次-匹配该字符“-字面意思是”(匹配下面的正则表达式,并将其匹配到后面引用号6 0-9a-f中匹配下面列表中的单个字符)。介于“0”和“9”之间的字符“a”和“f”之间的字符{ 12 }在0到1倍之间,尽可能多地归还(贪婪的)

票数 2
EN

Stack Overflow用户

发布于 2020-02-13 15:50:17

您可能更喜欢使用get-package:

代码语言:javascript
复制
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
代码语言:javascript
复制
get-package | % { $_.metadata['uninstallstring'] }

顺便说一下,如果您安装了Netbeans,它将崩溃get-itemproperty。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60210613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档