Powershell не хранит информацию цикла foreach в переменной

Я пытаюсь собрать список зрителей, установленных на наборе серверов. Я пытаюсь перебрать этот список, выполнить запрос 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 Viewer Microsoft Visio Viewer

Я вывожу файл и получаю пустой текстовый файл.

2 ответа

Решение
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"}
Другие вопросы по тегам