【问题标题】:Powershell not storing foreach loop info in VariablePowershell不在变量中存储foreach循环信息
【发布时间】:2019-02-07 18:46:25
【问题描述】:

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

【问题讨论】:

    标签: powershell foreach formattable


    【解决方案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"
    }
    

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

    【讨论】:

    • 使用过滤器时会产生以下错误“无效查询”select * from Win32_Product where Name LIKE 'Microsoft Office""
    • 使用第一块代码确实给了我结果,但是它没有给我任何信息,比如我运行它的计算机名称,所以我有一些格式化要做。如果可能的话,我希望它是 excel 格式的。
    • 如果您想要 Excel 格式,请使用 Export-CSV -NoTypeInformation -Append -Path "C:\viewers.csv" 而不是 Out-File。就过滤器而言,您必须像我一样明确地包含通配符,并且我提醒您,我确实说过我必须在每次编写新过滤器时都修改过滤器以使其“正确”......
    • 我把它放到了 excel 中,我想知道是否有一种快速的方法将它列为行服务器名称、foundobject1、foundobject2 等。现在它列为 Server1 Object1 Server1 Object2 Server1 Object3 Server2对象1
    【解决方案2】:

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

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

    这需要更改为

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

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

    【讨论】:

    • 实际产品名称是什么?这似乎不是我们在这里的系统上安装的东西,所以我没有真正的方法来测试我的过滤器。
    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 2015-05-10
    • 1970-01-01
    • 2018-03-29
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    相关资源
    最近更新 更多