Проблема с вашим кодом заключается в том, что вы выбираете одно свойство перед фильтрацией. Это приводит к сбою фильтрации, потому что эти свойства не существуют. Позвольте мне показать вам
Я предоставляю несколько примеров данных для всех.
@'
Device Name,Status,OS
Server1,Live,Windows Server 2019
Server2,Dead,Windows Server 2019
'@ | convertfrom-csv -OutVariable Servers
Если вы возьмете только эту часть вашего кода
$Servers | select "Device Name"
Результатом является объект PSObject с единственным свойством под названием «Имя устройства»
$Servers | select "Device Name"
Device Name
-----------
Server1
Server2
Поэтому при фильтрации по $ _. Status или $ _. OS он ничего не возвращает, потому что ничего не совпадает и нет ошибок.
$Servers | select "Device Name" | where {$_.Status -eq 'Live'} # No output
Однако, если вы просто измените порядок.
$Servers | where {$_.Status -eq 'Live'} | select "Device Name"
Device Name
-----------
Server1
Итак, если вы измените свой код на
$ServerList = "C:\Temp\ServerCompleteList.csv"
$Servers = Import-Csv -Path $ServerList
$LiveWindowsServerList = $Servers | where {$_.Status -eq "Live" -and $_.OS -like "*Windows*"} | select "Device Name"
, вы должны получить ожидаемый результат .
Чтобы продолжить ответ на ваш вопрос о хранении только имени сервера в переменной, дело в том, что вы уже сохранили его как переменную.
$servers.'Device Name'
Server1
Server2
Теперь это немного неудобно, потому что свойство содержит пробел. Это может проиллюстрировать это более наглядно.
$servers.OS
Windows Server 2019
Windows Server 2019
Еще одно небольшое примечание: если вы сравниваете отдельное свойство с Foreach, вы можете опустить такие фигурные скобки.
$Servers | where OS -like *Windows* | select "Device Name"
Device Name
-----------
Server1
Server2
Если вы необходимо сравнить два или более свойств, вы можете использовать фигурные скобки, как у вас, или связать их вместе.
$Servers | where OS -like *Windows* | where status -eq Dead | select "Device Name"
Device Name
-----------
Server2
Вы также можете заметить, что я не использовал кавычки в словах *windows* или Мертвый - насколько я понимаю, причина в том, что аргументы по умолчанию имеют строковый тип в PowerShell.