比较字符串与数组

时间:2018-06-10 03:34:33

标签: powershell

我是PowerShell脚本的新手。这是我使用pester创建测试时出现的问题。问题是如何比较数组与字符串:

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

如果有人能告诉我差异,我将不胜感激。

2 个答案:

答案 0 :(得分:6)

PowerShell运营商遵循"左手规则"。换句话说,LHS上对象的类型决定了比较的完成方式。如果LHS是一个数组,那么右侧将与RHS数组的每个元素进行比较。如果存在匹配,则运算符返回匹配元素。如果没有匹配,则操作员不返回任何内容。另一方面,如果LHS是一个字符串,那么右侧将被转换为字符串并进行比较。通过等效$array -join $OFS将数组转换为字符串。 $ OFS(输出字段分隔符)是一个内置变量,默认为" &#34 ;.这就是为什么你的第二次比较成功@(" Hello"," world")被转换为" Hello world"。

答案 1 :(得分:4)

-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,{{ 3}})。

'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
相关问题