PowerShell不要存储foreach循环信息在变

问题描述 投票:1回答:2

我想收集安装在一组服务器的观众名单。我通过列表尝试循环和运行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文件。

powershell foreach formattable
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"
}

(我觉得我有过滤器语法正确,我似乎已经在它的每一个我写了一个新的过滤的时间来破解...)


1
投票

我没有足够的代表处添加评论,但杰夫是正确的。不过,也有仍然与原来的海报的查询问题。下面的代码段将会产生基于由海报提供的实施例没有结果:

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

需要或者改为

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

要么

{$_.name -match "Microsoft.*?Viewer"}
© www.soinside.com 2019 - 2024. All rights reserved.