我是PowerShell脚本的新手。这是我使用pester创建测试时出现的问题。问题是如何比较数组与字符串:
@('hello', 'world') -eq 'hello world' # returns nothing
'hello world' -eq @('hello', 'world') # returns true
如果有人能告诉我差异,我将不胜感激。
答案 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