Сравнить строку с массивом - PullRequest
0 голосов
/ 10 июня 2018

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

@('hello', 'world') -eq 'hello world' # returns nothing
'hello world' -eq @('hello', 'world') # returns true

Буду признателен, если кто-нибудь подскажет мне разницу.

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Операторы PowerShell следуют «правилу левой руки».Другими словами, тип объекта на LHS определяет, как выполняется сравнение.Если LHS является массивом, то правая часть будет сравниваться с каждым элементом массива RHS.Если есть совпадения, то оператор возвращает совпадающие элементы.если совпадений нет, то оператор ничего не возвращает.С другой стороны, если LHS является строкой, то правая часть будет преобразована в строку, и сравнение будет выполнено.Массив преобразуется в строку, выполняя эквивалент $array -join $OFS.$ OFS (разделитель выходных полей) - встроенная переменная, которая по умолчанию имеет значение "".Вот почему ваше второе сравнение успешно @ ("Hello", "world") преобразуется в "Hello world".

0 голосов
/ 10 июня 2018

-eq возвращает разные вещи при применении к разным типам значений.

1,2,3,4,1 -eq 1     # returns @(1, 1)

Таким образом, при применении к массиву с левой стороны, он возвращает все элементы из этого массива, которые равныправый операнд.Он работает как фильтр для массивов (то же самое относится и к другим операторам сравнения, таким как -ne, -gt и т. Д.)

@('hello', 'world') -eq 'hello world' # returns nothing

Естественно.


Когда -eq применяется к одному значению на левой стороне, возвращает $true или $false в зависимости от того, равна ли ему правая часть.

Произойдет преобразование типа.Например, если левая часть является строкой, правая часть также преобразуется в строку.

Массивы преобразуются в строку путем преобразования всех их элементов в строку и соединения их с однимпо умолчанию пробел (используемый символ можно изменить с помощью другого $OFS - см. MSDN , Блог команды Powershell ).

'hello world' -eq @('hello', 'world')   # returns true

Естественно.Но:

'hello world' -eq @('hello ', 'world')  # returns false, note the space

Используйте .Equals(), чтобы предотвратить это.

'hello world'.Equals( @('hello', 'world') )  # returns false
(1).Equals("1")                              # false, too
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...