在PowerShell中检查计算机是否已安装程序

时间:2014-12-10 16:25:02

标签: powershell installed-applications

我希望能够在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}

2 个答案:

答案 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-MemberComputer添加属性。现在我们可以使用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开关,或者您只需将一台计算机放入文件中。