проверить, существует ли строка в списке строк, используя powershell - PullRequest
0 голосов
/ 08 июля 2019

У меня есть Powershell версии 3,4 и 5 в моей среде.Когда я пишу код ниже, он постоянно выдавал мне ложь, хотя $ CompatiableOS содержит вывод $ OSverions.

   [string] $CompatiableOS = '2016','2012','2008'
   $OSVersion=[regex]::Matches(((Get-WmiObject -class Win32_OperatingSystem).caption), "([0-9]{4})")

   if ( $CompatiableOS -contains  $OSVersion)
   {
      return $TRUE
   }
   else
   {
      return $FALSE
   }

, но когда я изменил код выше на ниже, это сработало.В чем может быть проблема?

 [string] $CompatiableOS = '2016','2012','2008'
 $OSVersion=[regex]::Matches(((Get-WmiObject -class Win32_OperatingSystem).caption), "([0-9]{4})")

 if ( $CompatiableOS.contains($OSVersion))
 {
    return $TRUE
 }
 else
 {
      return $FALSE
 }

Ответы [ 3 ]

2 голосов
/ 08 июля 2019

Хотя $ CompatiableOS содержит выходные данные $ OSverions, однако -contains используется только для одного тестового значения и возвращает true, если тестовое значение точно соответствует хотя бы одному из контрольных значений.Однако, когда тестовое значение является коллекцией, оператор Contains использует равенство ссылок.Он возвращает TRUE, только если одно из опорных значений является одним и тем же экземпляром объекта тестового значения.Важно то, что в этом случае они должны быть одного экземпляра.Например:

PS> «abc», «def», «ghi» - содержит «abc», «def»

-> False

PS> $ a= "abc", "def"

PS> "abc", "def", "ghi" - содержит $ a

-> False

PS> $ a, "ghi" - содержит $ a

-> True

Обратите внимание, как последний возвращает true из-за того же экземпляра, а остальные были ложными.Таким образом, используя -contains, вы получили False.Однако, когда вы используете формат содержимого (..), он не проверяет один и тот же экземпляр и, таким образом, возвращает True, в вашем случае.

2 голосов
/ 08 июля 2019

Это много подходит.-contains против .contains ().Они очень разные.-содержит должен точно соответствовать.Но левая сторона может быть массивом строк.Вы фактически соединили все в одну строку слева с помощью приведения [string].

$compatibleos
'2016 2012 2008'

'2016 2012 2008' -contains '2016'
False

'2016 2012 2008'.contains('2016')
True

'2016','2012','2008' -contains '2016'
True

('2016','2012','2008').contains('2016')
True
0 голосов
/ 08 июля 2019

Из документации MS

- Содержит описание: Оператор сдерживания.Сообщает, включает ли коллекция эталонных значений одно тестовое значение.Всегда возвращает логическое значение.Возвращает значение ИСТИНА только в том случае, если тестовое значение точно соответствует хотя бы одному из контрольных значений.

Важной частью здесь является " только в том случае, если тестовое значение точно соответствует ".В вашем случае вы пытаетесь сравнить строку «2016 2012 2008» с примером 2016, этот вариант не совпадает точно.В этом случае вы должны использовать оператор -like.Или вы определяете вашу совместимую переменную OS как строковый массив, подобный этому [String[]], тогда вы можете использовать -contains.

Additonal, проверить что внутри переменной OSVersion.Это коллекция, а не строка.Если вы определяете свою переменную compatibilityOS как строковый массив и используете $OSVersion.Value, оба ваших примера будут работать.

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