【发布时间】:2017-01-06 22:49:22
【问题描述】:
总的来说,我的目标是获取远程计算机列表的 VNC 版本以及卸载 GUID,以便我可以从某些计算机远程卸载 VNC 查看器。我使用了 Get-WmiObject -Class Win32_Product,但这非常慢。
我有以下脚本,但在结果中它包含选择对象参数的名称。
$computers = Get-Content -Path "C:\Computers.txt"
$Results = @()
ForEach ($Computer in $Computers) {
$Results += New-Object PSObject -Property @{
"ComputerName" = $Computer
"Name" = Invoke-Command -ComputerName $Computer -ScriptBlock { Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* } `
| Where-Object -FilterScript {$_.DisplayName -like "VNC V*"} | select-object DisplayName
"DisplayVersion" = Invoke-Command -ComputerName $Computer -ScriptBlock { Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* } `
| Where-Object -FilterScript {$_.DisplayName -like "VNC V*"} | select-object DisplayVersion
"ModifyPath" = Invoke-Command -ComputerName $Computer -ScriptBlock { Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* } `
| Where-Object -FilterScript {$_.DisplayName -like "VNC V*"} | select-object ModifyPath
"Vendor" = Invoke-Command -ComputerName $Computer -ScriptBlock { Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* } `
| Where-Object -FilterScript {$_.DisplayName -like "VNC V*"} | select-object Publisher
}
}
$Results | Select-Object ComputerName,Name,DisplayVersion,ModifyPath,Vendor | Sort-Object ComputerName | Export-Csv C:\VNC.csv -notype ;
我的结果如下所示:
计算机名 : 计算机名
名称 :@{DisplayName=VNC Viewer 5.2.3}
DisplayVersion :@{DisplayVersion=5.2.3}
ModifyPath :@{ModifyPath=MsiExec.exe /I{18B1E36F-0DA3-4FDA-BC57-DD815B0DF3B2}}
供应商 :@{Publisher=RealVNC Ltd}
我希望它看起来像这样:
计算机名 : 计算机名
名称 :VNC 查看器 5.2.3
显示版本 :5.2.3
ModifyPath :MsiExec.exe /I{18B1E36F-0DA3-4FDA-BC57-DD815B0DF3B2}
供应商 :RealVNC Ltd
这是可能的还是我完全错误地处理这个脚本?我还没有想出一种方法来为多个参数运行这个 Invoke-Command 并且仍然以任何其他方式将结果输出到各个列中。
此脚本有效,但需要 100 台计算机才能运行:
if (Test-Path C:\VNCInstalled.csv) {Remove-Item C:\VNCInstalled.csv}
if (Test-Path C:\Computers.txt) {Remove-Item C:\Computers.txt}
$DirSearcher = New-Object System.DirectoryServices.DirectorySearcher([adsi]'')
$DirSearcher.Filter = '(&(objectClass=Computer)(!(cn=*esx*)) (!(cn=*slng*)) (!(cn=*dcen*)) )'
$DirSearcher.FindAll().GetEnumerator() | sort-object { $_.Properties.name } `
| ForEach-Object { $_.Properties.name }`
| Out-File -FilePath C:\Computers.txt
Get-Content -Path c:\Computers.txt `
| ForEach-Object {Get-WmiObject -Class Win32_Product -ComputerName $_} `
| Where-Object -FilterScript {$_.Name -like "VNC V*"} `
| select-object @{Name="ComputerName";Expression={$_.PSComputerName}},
Name,
@{Name="InstallLocation";Expression={$_.PackageCache}},
Vendor,
Version,
@{Name="GUID";Expression={$_.IdentifyingNumber}} `
| Sort-Object ComputerName `
| Export-CSV -path c:\VNCInstalled.csv -notype
【问题讨论】:
-
试试
select-object -ExpandProperty DisplayVersion -
哇,这么简单,太棒了,谢谢!!