gpt4 book ai didi

powershell - 查找非空字符串值时, "-gt 0"和 "-eq $true"有什么区别?

转载 作者:行者123 更新时间:2023-12-03 11:16:53 26 4
gpt4 key购买 nike

我正在收集 AD 中具有非空职位的所有用户帐户的列表。首先我得到所有的用户(我稍后会过滤):

$allUsers = get-aduser -filter * -properties *

然后我只抓取那些标题非空的帐户。首先,我尝试了以下想法,“好吧,如果存在一个值,它将评估为 $true。”

$allUsers | ? {$_.Title -eq $true}

但这会导致一个空列表。因此,我通过执行以下操作尝试了我认为相同的事情:

$allUsers | ? {$_.Title -gt 0}

在这种情况下,我得到了预期的结果。

这两种说法有什么区别?我的想法是 PowerShell 的 -eq 就像 JavaScript 中的 === 。对吗?

最佳答案

发生这种情况是因为 PowerShell 试图将比较的右侧强制转换为左侧类型。

$allUsers | ? {$_.Title -eq $true}

这失败了,因为它和做的一样:

$allUsers | ? {$_.Title -eq "True"}

要了解原因,请尝试转换:[string]$true

另一方面,如果您这样做了(我建议您这样做):

$allUsers | ? {$_.Title}

它会按预期工作。

同样,当您这样做时:

$allUsers | ? {$_.Title -gt 0}

这就像做:

$allUsers | ? {$_.Title -gt "0"}

从理论上讲,这是一个更危险的比较,因为以 @ 开头的标题将返回 false。实际上,您的标题不太可能以低于 0 的字符值开头,因为所有字母(无论大小写)都具有更高的值。但我没有考虑国际化。

Though for my own sake, and the sake of those that come after me, would you edit your post to explain exactly why {$_.Title} is the preferable method?

我并不是说它绝对是最好的,但我喜欢它有几个原因:

  • 很短。
  • 它不包含任何嵌入式常量。不确定这是否重要,但不会出错。
  • (在我看来)很清楚您要测试什么,因为这是在许多语言中测试它的常用方法。
  • 它适用于 $null 和空字符串。

还有其他方法:

$allUsers | ? { ![String]::IsNullOrEmpty($_.Title) }
$allUsers | ? { $_.Title.Length -gt 0 }
$allUsers | ? { $_.Title -ne "" } # would include $null titles
$allUsers | ? { $_.Title -ne $null } # would include empty string titles

我没有解决的其他问题:您应该在 Get-ADUser-Filter 属性中进行比较,理想情况下您应该只询问您需要的属性需要:

$allUsers = Get-ADUser -Filter { -not (Title -like "*") } -Properties Title

-Filter 参数看起来像一个脚本 block ,但它有自己的语法和有效的运算符和值,所以它有点棘手。不过这应该快得多。

关于powershell - 查找非空字符串值时, "-gt 0"和 "-eq $true"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31256605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com