我想收集安装在一组服务器的观众名单。我通过列表尝试循环和运行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对象2
Server1上了Microsoft Excel Viewer Microsoft Visio中查看器
我输出的文件,并得到一个空白的txt文件。
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"
}
(我觉得我有过滤器语法正确,我似乎已经在它的每一个我写了一个新的过滤的时间来破解...)
我没有足够的代表处添加评论,但杰夫是正确的。不过,也有仍然与原来的海报的查询问题。下面的代码段将会产生基于由海报提供的实施例没有结果:
{$_.name -match "Microsoft Viewer*"}
需要或者改为
{$_.name -like "*Microsoft*Viewer*"}
要么
{$_.name -match "Microsoft.*?Viewer"}