1

我正在尝试收集安装在一组服务器上的查看器列表。我正在尝试遍历该列表并运行 wmi 查询并存储结果并导出带有 wmi 结果和服务器名称旁边的表。

我在服务器 2012 上运行它

$computers = Get-Content C:\computers.txt

$WMIQuery = foreach ($computer in $computers){Get-WmiObject -Class 
Win32_Product | where-object {$_.name -match "Microsoft Viewer*"}}

$WMIQuery

$WMIQuery | Out-File c:\Viewers.txt

期望的结果

服务器名称 Object1 Object2

Server1 Microsoft Excel 查看器 Microsoft Visio 查看器

我输出文件并得到一个空白的txt文件。

4

2 回答 2

1
foreach ($computer in (Get-Content -Path "C:\computers.txt")) {
    Get-WMIObject -ComputerName $computer -Class Win32_Product |
        Where-Object {$_.name -match "Microsoft Viewer" } |
            Out-File -Append -Path "C:\viewers.txt"
}

您的原始代码没有识别要执行的计算机Get-WMIObject,因此它只查看您运行脚本的计算机。

如果远程计算机上有很多产品,您可能需要考虑在远程计算机上而不是在本地进行过滤,以避免通过可能比理想网络慢的网络传输大量数据:

foreach ($computer in (Get-Content -Path "C:\computers.txt")) {
    Get-WMIObject -ComputerName $computer -Class Win32_Product -Filter "Name LIKE '*Microsoft Viewer*'"|
        Out-File -Append -Path "C:\viewers.txt"
}

(我认为我的过滤器语法是正确的;我似乎每次编写新过滤器时都必须破解它......)

于 2019-02-07T19:02:12.910 回答
1

我没有足够的代表来添加评论,但 Jeff 是正确的。但是,原始发帖人的查询仍然存在问题。根据海报提供的示例,以下代码将不会产生任何结果:

{$_.name -match "Microsoft Viewer*"}

这需要更改为

{$_.name -like "*Microsoft*Viewer*"}

或者

{$_.name -match "Microsoft.*?Viewer"}
于 2019-02-07T19:11:00.867 回答