Powershell 获取安装程序脚本没有 return 计算机名
Powershell get installed program script doesn't return computer name
我正在尝试从一组远程服务器中获取已安装程序的列表。我可以获取程序名称,但不能 return 系统名称。下面是我的脚本。
$computerfile = get-content "D:\Users\Admin\Docs\PrimaryServers.txt"
ForEach ($computer in $computerfile) {
Get-WmiObject Win32_Product -ComputerName $computer |
Select-Object SystemName,Name,Version,PackageName,Installdate,Vendor |
Format-Table -AutoSize
}
下面是我的输出
首先,-ComputerName
可以采用名称数组,因此通过循环您将增加时间,因为循环将是串行的,而使用计算机名数组将是并行的。
其次,最佳做法是使用 CIM cmdlet 代替 WMI cmdlet。默认情况下,它们在 WSMAN 上运行并且更易于使用。
第三,Win32_Product 强制进行一致性检查,因此阅读 Uninstall registry keys 通常更好。
最后,SystemName
不是 Get-WMIObject
返回的 属性 名称。 PSComputerName
是您正在寻找的 属性,您可以从中制作 Calculated Property。
$computerfile = get-content "D:\Users\Admin\Docs\PrimaryServers.txt"
Get-CimInstance Win32_Product -ComputerName $Computerfile |
Select-Object @{n=SystemName;e={$_.PSComputerName}},Name,Version,PackageName,Installdate,Vendor |
Format-Table -AutoSize
另一种方法是使用 Invoke-Command
,它会使用 PSComputerName
列自动扩展结果
首先构建脚本块以用作查询[=18=]
块 1 是我对 x32 和 x64 实现的方法。考虑将此作为替代方案,因为我对提议的实施存在一些问题。
$block1={
# Query x64 bit applications
$queryPath="HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
Get-ItemProperty $queryPath | Select-Object -Property DisplayName, Publisher, InstallDate, DisplayVersion
# Query x32 bit applications
$queryPath="HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"
Get-ItemProperty $queryPath | Select-Object -Property DisplayName, Publisher, InstallDate, DisplayVersion
}
Block 2 是关于这个问题的建议方法
$block2={
Get-CimInstance Win32_Product | Select-Object Name,Version,PackageName,Installdate,Vendor
}
对于 $block1
或 $block2
在服务器列表上远程执行
Invoke-Command -ComputerName $computernames -ScriptBlock $block1
一条记录看起来像这样
DisplayName : Microsoft Visual C++ 2013 x86 Additional Runtime - 12.0.21005
Publisher : Microsoft Corporation
InstallDate : 20161202
DisplayVersion : 12.0.21005
PSComputerName : MECDEVAPP01
RunspaceId : 4b8cc747-da25-4c6e-b108-0ca3138c0335
我正在尝试从一组远程服务器中获取已安装程序的列表。我可以获取程序名称,但不能 return 系统名称。下面是我的脚本。
$computerfile = get-content "D:\Users\Admin\Docs\PrimaryServers.txt"
ForEach ($computer in $computerfile) {
Get-WmiObject Win32_Product -ComputerName $computer |
Select-Object SystemName,Name,Version,PackageName,Installdate,Vendor |
Format-Table -AutoSize
}
下面是我的输出
首先,-ComputerName
可以采用名称数组,因此通过循环您将增加时间,因为循环将是串行的,而使用计算机名数组将是并行的。
其次,最佳做法是使用 CIM cmdlet 代替 WMI cmdlet。默认情况下,它们在 WSMAN 上运行并且更易于使用。
第三,Win32_Product 强制进行一致性检查,因此阅读 Uninstall registry keys 通常更好。
最后,SystemName
不是 Get-WMIObject
返回的 属性 名称。 PSComputerName
是您正在寻找的 属性,您可以从中制作 Calculated Property。
$computerfile = get-content "D:\Users\Admin\Docs\PrimaryServers.txt"
Get-CimInstance Win32_Product -ComputerName $Computerfile |
Select-Object @{n=SystemName;e={$_.PSComputerName}},Name,Version,PackageName,Installdate,Vendor |
Format-Table -AutoSize
另一种方法是使用 Invoke-Command
,它会使用 PSComputerName
列自动扩展结果
首先构建脚本块以用作查询[=18=]
块 1 是我对 x32 和 x64 实现的方法。考虑将此作为替代方案,因为我对提议的实施存在一些问题。
$block1={
# Query x64 bit applications
$queryPath="HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
Get-ItemProperty $queryPath | Select-Object -Property DisplayName, Publisher, InstallDate, DisplayVersion
# Query x32 bit applications
$queryPath="HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"
Get-ItemProperty $queryPath | Select-Object -Property DisplayName, Publisher, InstallDate, DisplayVersion
}
Block 2 是关于这个问题的建议方法
$block2={
Get-CimInstance Win32_Product | Select-Object Name,Version,PackageName,Installdate,Vendor
}
对于 $block1
或 $block2
在服务器列表上远程执行
Invoke-Command -ComputerName $computernames -ScriptBlock $block1
一条记录看起来像这样
DisplayName : Microsoft Visual C++ 2013 x86 Additional Runtime - 12.0.21005
Publisher : Microsoft Corporation
InstallDate : 20161202
DisplayVersion : 12.0.21005
PSComputerName : MECDEVAPP01
RunspaceId : 4b8cc747-da25-4c6e-b108-0ca3138c0335