我希望能够在powershell中查找已安装的程序并将结果输出到文件中。到目前为止,我有一些将列出安装程序,并选择具有该程序名称的字符串,但我不知道如何指定一个文本文件,以用于系统列表,以及一种方法让它输出干净。
Get-WmiObject -Class Win32_Product -cn $computernamehere | Select-Object -Property Name | Sort-Object Name | Select-String Vmware | Out-File C:\Users\ajstepanik\Desktop\installed_programs.txt
我希望以类似的方式输出:
COMPUTER1 - VMware Horizon View Client
COMPUTER2 - VMware Horizon View Client
COMPUTER3 - VMware Horizon View Client
目前输出:
@{Name=VMware Horizon View Client}
@{Name=VMware Horizon View Client}
@{Name=VMware Horizon View Client}
答案 0 :(得分:1)
在你的情况下,我放弃了我先前关于-ExpandProperty
的陈述。我仍然是正确的,它将只返回一个字符串数组而不是object属性。但是我认为如果你把它作为一个对象并且只是添加属性"计算机"你会有更多的选择。你在找什么。那就是我们可以把它作为一个漂亮的CSV!我假设这里有一些你没有显示的循环结构。
$list = Get-Content C:\Users\ajstepanik\Desktop\computers.txt
$list | ForEach-Object{
$computer = $_
Get-WmiObject -Class Win32_Product -ComputerName $computer |
Select-Object -Property Name |
Sort-Object Name |
Where-Object{$_.Name -match "Citrix"} |
Add-Member -MemberType NoteProperty -Name "Computer" -Value $computer -passthru
} | Export-Csv -NoTypeINformation -Path C:\temp\path.csv
将select-string
更改为Where
n Match
,因为我保留了该对象。使用Add-Member
为Computer
添加属性。现在我们可以使用Export-CSV
忘记foreach($x in $y)
与其他foreach的工作方式无关。
答案 1 :(得分:0)
让C:\ComputerList.txt
成为每行上有一个计算机名称的计算机列表,如:
COMPUTER1
COMPUTER2
COMPUTER3
COMPUTER4
所以,我会这样做:
$ComputerListFile = 'C:\ComputerList.txt';
$OutputFile = 'C:\VMWareSoftwareReport.csv';
#Variable for the report with header
$Report = @();
$Report += '"ComputerName","SoftwareName","SoftwareVersion"';
#Get the list of computers
$ComputerList = Get-Content $ComputerListFile;
$ComputerList | ForEach-Object {
$ComputerName = $_;
#Ping the target to see if it's there
If ((Get-WmiObject Win32_PingStatus -Filter "Address='$ComputerName' AND Timeout=1000").StatusCode -eq 0) {
#Get the list of software
$vmWareSoftware = Get-WmiObject -Query "SELECT Name, Version FROM Win32_Product WHERE Name LIKE '%vmWare%'" -ComputerName $ComputerName | Sort-Object -Property Name;
$vmWareSoftware | ForEach-Object {
#Format the results, escape any double quotes, and add them to the report
$SoftwareName = $_.Name.Replace('"','""');
$SoftwareVersion = $_.Version.Replace('"','""');
$Report += '"{0}","{1}","{2}"' -f $ComputerName, $SoftwareName, $SoftwareVersion;
}
}
}
#Write the report file, overwriting if needed
Set-Content -Path $OutputFile -Value $Report -Force;
您可能希望将Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*
用作@ expirat001提及,但Get-ItemProperty
无法定位远程计算机。它也可能不是一个完整的列表。就此而言,Win32_Product
也可能不完整。没有全面的方法可以在Windows中找到所有已安装的软件。
另请注意,Out-File
默认情况下会覆盖,而不会追加。您必须指定-Append
开关,或者您只需将一台计算机放入文件中。