Powershell不在变量中存储foreach循环信息

时间:2019-02-07 18:46:26

标签: powershell foreach formattable

我正在尝试收集安装在一组服务器上的查看器的列表。我正在尝试遍历该列表并运行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

所需结果

服务器名称对象1对象2

Server1 Microsoft Excel Viewer Microsoft Visio Viewer

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

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

需要将其更改为

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

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