【问题标题】:PowerShell LogicPowerShell 逻辑
【发布时间】:2013-04-01 12:28:05
【问题描述】:

看着help section about_Comparison_Operators of PowerShell这个我明白了:

PS C:\> $false,$false -eq $true
PS C:\> 

左侧没有任何内容与右侧匹配,因此即使是 $null,也不会返回任何内容。

我不明白:

PS C:\> $true -eq $false,$false
True
PS C:\> 

是不是因为它首先执行 $true -eq $false 返回 False,然后采用该 False 并执行 $false -eq $false 返回 True ?

更多信息

下面返回 false 的原因是因为它将字符串与数组进行比较,对吗?字符串不等于数组。

PS C:\> "abc" -eq "abc","def"
False

回答?

更多挖掘表明$true 等于一个对象。

PS C:\> $true -eq [array]
True
PS C:\> $true -eq [string]
True
PS C:\> $true -eq [int]
True
PS C:\> $true -eq [bool]
True

重要的是这些对象的值。

PS C:\> $true -eq [int]0
False

【问题讨论】:

  • +1 好问题,但我能问一下您需要它吗?我无法看到可以使用它的场景。
  • 了解 PowerShell 的工作原理。还看着link 不知道为什么"abc" -eq "abc", "def" 不起作用。

标签: powershell compare logic equals


【解决方案1】:

我喜欢这样的关于语言行为和特性的基本问题...给我一个阅读 PowerShell 语言规范的借口。

您可以下载上述规范:2.03.0。请参阅第 7.8.1 节 - 相等和关系运算符。

对于问题的第一部分,实际上返回的是一个空数组,如:($false,$false -eq $true).psbase

Length         : 0
LongLength     : 0
Rank           : 1
SyncRoot       : {}
IsReadOnly     : False
IsFixedSize    : True
IsSynchronized : False
Count          : 0

来自规范 -

如果左操作数指定的值不是集合,则 结果具有布尔类型。否则,结果可能为空 包含元素的无约束一维数组 与指定的值进行比较时测试 True 的集合 右操作数。

对于第二部分,因为左操作数本身就是一个布尔值,我认为它总是结果。仅当右操作数是集合时。

一些例子:

$true -eq 1,2,3,4
$true -eq '','','',''
$true -eq '',1,$true,$false
$true -eq $null,$false,1,''

所有这些都返回$true。相反,所有这些都返回$false

$false -eq 1,2,3,4
$false -eq '','','',''
$false -eq '',1,$true,$false
$false -eq $null,$false,1,''
$false -eq $true,$true,$true

左操作数的类型很重要。这将返回 $true: $false -eq 0,因为右操作数可以转换为左操作数的类型。

【讨论】:

  • 安迪成功了。逻辑表达式从左到右处理,左操作数的类型决定了右操作数的解释方式。如果您在可视化规范时遇到问题,请分解逻辑并检查 PowerShell 正在执行的转换:[bool]0; [布尔]1; [布尔]@(); [布尔]@($false); [布尔]@($false,$false); [布尔]''; [布尔]$null; #ad nauseum...
  • 我希望这些评估相同,但他们没有:[bool](@(1) -eq 1) [bool](1 -eq @(1))跨度>
  • 首先:-eq 从集合中返回 1,然后转换为 bool 使其成为 $true。第二个-eq 返回布尔值,因为左操作数是一个缩放器,并且转换为布尔值使其为假。当正确的操作数是一个集合时,我不确定 PowerShell 会做什么来确定布尔值。规范没有具体说明它,所以它是一个有趣的游戏供我们推断:D
  • 如果将 [int] 1 替换为 [string] 1,它们的计算结果相同。
  • @AndyArismendi,@mjolinor:为了改写 beefarino 的评论,标准相等将 right 操作数强制为 left 操作数的类型,然后比较 左和。唯一的特殊情况是 left 是一个集合(然后在 left 的每个元素上测试相等性,并返回匹配的元素)。因此对于'1' -eq @(1)'1' -eq @('1')right 在比较之前被强制转换为字符串'1''1 0' -eq @('1','0') 也将返回true,默认值为$OFS);对于1 -eq @(1)right 不能强制为整数,比较返回 false。
【解决方案2】:

最佳猜测:

它的评估结果为 True,因为它是一个包含多个成员的数组。数组没有 ToBoolean() 方法。

只要它是一个标量,或者一个只有一个成员的数组,Powershell 就可以将它强制转换为一个标量并获取该成员的 ToBoolean() 方法。只要它达到 2 或更多,它总是返回 True,不管元素是什么。如果没有 ToBoolean(),并且它回退到默认的 ToString() 方法,那么它总是会评估为 True。

也许不是。

【讨论】:

  • 我添加了一个 ToBoolean 方法,返回 false 到数组列表,但比较返回 false 测试 $false -eq $array_list_with_to_bool。所以我不确定是不是因为存在一个名为 ToBoolean 的方法。
【解决方案3】:

也许-eq 运算符正在评估它们的存在(也不是$null)而不是它们的价值。

也许类似于 IF 语句?

PS> if("anyval"){$true}else{$false}
True

@Joey 提供的This 答案可能也很有用。

【讨论】:

  • 实际上,我认为您提供的链接就是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多