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"}