gpt4 book ai didi

用于输出已安装程序的 Powershell 脚本

转载 作者:行者123 更新时间:2023-12-02 22:55:33 25 4
gpt4 key购买 nike

我想使用 win32_product wmi 类来执行此操作。

我需要脚本来简单地计算安装的产品数量,并输出执行脚本所花费的时间。

我的 atm 似乎不能正常工作:

    $count = 0
$products = get-wmiobject -class "Win32_Product"
foreach ($product in $products) {
if ($product.InstallState -eq 5) {
count++
}
}
write-host count

最佳答案

注意!不建议为此目的使用 WMI 的 Win32_Product 类(问题和前 2 个答案所做的)。

简而言之:使用 Win32_Product 不是无害的查询,因为它有副作用。引用 Microsoft 的话说,“[它]...启动已安装软件包的一致性检查,验证并修复安装。” (强调我的)

引用资料:


那么更好(更安全)的解决方案是什么?

Marc Carter,在你好,脚本专家! 博客中写了客座专栏,上面的博客采取了第一次 Volley ,提供了一个自定义的 PowerShell 函数,回到我的系统上它只返回了一半的条目Win32_Product 调用。此外,它有很多代码(大约 3 打行)。然而,在他的帖子的评论中,knutkj 提供了这个更短的版本来做同样的事情:

Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall |
Get-ItemProperty |
Sort-Object -Property DisplayName |
Select-Object -Property DisplayName, DisplayVersion, InstallLocation

但正如我所说,它确实是同一件事:不提供完整列表。但这是一个开始。

Nick W 稍后在评论中报告说实际上有 3 个感兴趣的注册表路径,但并非所有系统都存在。此外,在查看这 3 条路径时,必须进行一些额外的过滤。

结合这两者,添加更多的输出字段,并使代码在严格模式下安全运行,我得出了这个简单的解决方案:

function Get-InstalledPrograms()
{
$regLocations = (
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\",
"HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\",
"HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
)

Get-ChildItem ($regLocations | Where { Test-Path $_ } ) |
Get-ItemProperty |
Where {
( (Get-Member -InputObject $_ -Name DisplayName) -and $_.DisplayName -ne $Null) -and
(!(Get-Member -InputObject $_ -Name SystemComponent) -or $_.SystemComponent -ne "1") -and
(!(Get-Member -InputObject $_ -Name ParentKeyName) -or $_.ParentKeyName -eq $Null)
} |
Sort DisplayName |
Select DisplayName, DisplayVersion, Publisher, InstallLocation, InstallDate, URLInfoAbout
}

关于用于输出已安装程序的 Powershell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2854959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com