Выбор одного столбца, где другой равен указанному c значению - PullRequest
0 голосов
/ 05 августа 2020

У меня есть файл CSV со списком серверов в одном столбце, в следующем столбце, если сервер работает, а в третьем - ОС сервера. Я хотел бы присвоить имена сервера переменной, в которой ОС является дистрибутивом Windows, однако я хочу, чтобы переменная сохраняла только имя сервера.

$ServerList = "C:\Temp\ServerCompleteList.csv"
$Servers = Import-Csv -Path $ServerList
$LiveWindowsServerList = $Servers | select "Device Name"| where {($_.Status -eq "Live" -and $_.OS -like "*Windows*")}

Вызов $LiveWindowsServerList возвращает неважно. Если я также выберу Статус и ОС, переменная отобразит список правильно

$ServerList = "C:\Temp\ServerCompleteList.csv"
$Servers = Import-Csv -Path $ServerList
$LiveWindowsServerList = $Servers | select "Device Name","Status","OS"| where {($_.Status -eq "Live" -and $_.OS -like "*Windows*")}

Можно ли сохранить только имена серверов в переменной, если Статус - Активен, а ОС - Windows?

1 Ответ

1 голос
/ 06 августа 2020

Проблема с вашим кодом заключается в том, что вы выбираете одно свойство перед фильтрацией. Это приводит к сбою фильтрации, потому что эти свойства не существуют. Позвольте мне показать вам

Я предоставляю несколько примеров данных для всех.

@'
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...