PowerShell возвращает несколько значений из условия if

У меня есть сценарий Powershell, возвращающий данные из API, который работает нормально, пока я пытаюсь вернуть только один $device.realm, но мне нужно несколько областей. Я новичок в PS. Любая помощь здесь действительно ценится

Вот мой код $Output = forEach ($device в $devices) {

    if ($device.realmName -eq 'Archive') {
    [PSCustomObject]@{
        HostName = $device.name
        IPAddress = $device.primaryInterfaceAddress
        Realm = $device.realmName
        SerialNumbers = (($device.dynamicFields  | where { $_.name -EQ "serial number" } | Select-Object -ExpandProperty values) -join "," | out-string).TrimEnd()
        }| Select-Object Hostname,IPAddress,Realm,SerialNumbers | Export-csv C:\temp\Archive.csv  -notype -Append 
        
    }

Мне нужно вернуть несколько $device.realms, как если бы ($device.realmName -eq 'Архив' -и 'По умолчанию' -и 'Фермы')

Как только я добавляю дополнительное -and, возвращается каждая область, а не только та, которую мне нужно вернуть.


person lito    schedule 22.07.2020    source источник
comment
Почему бы просто не иметь три блока операторов if, каждый из которых имеет только одно из значений?   -  person AdminOfThings    schedule 22.07.2020
comment
Было бы полезно, если бы вы предоставили образец того, что содержит $devices.   -  person AdminOfThings    schedule 22.07.2020


Ответы (1)


Я полагаю, что проблема заключается в том, что оператор в блоке If, который вы запрашиваете как ($device.realmName -eq 'Archive' -and 'Default' -and 'Farms')
, при логической оценке не соответствует истине, если имя области устройства — Archive, Default или Farms. Он оценивает, является ли device.realmname архивом, а затем просто интерпретирует два -и в вашем примере как истинные, поскольку они не запрашивают сравнение, а просто наличие ненулевой строки. Не уверен, что заставляет его возвращать все, мне нужно увидеть еще несколько прямых примеров, чтобы быть уверенным, но по моему опыту это наиболее распространено, когда вы включаете -или в сравнение, указывающее на ненулевую строку, что сделает все утверждение верно.

Я бы предложил следующее: используйте операторы регулярных выражений, встроенные в powershell, для таких случаев. Вы могли бы использовать

if($device.realmname -eq 'Archive' -or $Device.realmname -eq 'farm' -or $device.realmname -eq 'Default')

который, я считаю, вернет то, что вы ищете, но я нахожу это немного сложным. Я считаю, что более сложные запросы к одному свойству проще всего выполнять с помощью -match, через что-то, вызывающее оператор -match, который позволяет вам построить оператор запроса регулярного выражения, который может включать Or или And с немного более простым синтаксисом, вот так:

if($Device.realmName -match 'Archive|Farm|Default')
person Chakani    schedule 22.07.2020
comment
Большое спасибо за то, что поделились использованием -match - это именно то, что требовалось. - person lito; 23.07.2020