Powershell “与”的区别是什么-GT0";及-eq$true“;查找非空字符串值时?

Powershell “与”的区别是什么-GT0";及-eq$true“;查找非空字符串值时?,powershell,Powershell,我正在收集广告中所有具有非空职务的用户帐户的列表。首先,我获取所有用户(稍后我将进行筛选): 然后我只抓取那些标题非空的账户。首先,我尝试了下面的想法,“好吧,如果存在一个值,它将评估为$true。” 但这会导致一个空列表。因此,我尝试了我认为相同的方法,做了以下几件事: $allUsers | ? {$_.Title -gt 0} 在这种情况下,我得到了预期的结果 这两种说法的区别是什么?我的想法是PowerShell的-eq类似于JavaScript中的===。这是否正确?之所以会发生这种

我正在收集广告中所有具有非空职务的用户帐户的列表。首先,我获取所有用户(稍后我将进行筛选):

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

但这会导致一个空列表。因此,我尝试了我认为相同的方法,做了以下几件事:

$allUsers | ? {$_.Title -gt 0}
在这种情况下,我得到了预期的结果


这两种说法的区别是什么?我的想法是PowerShell的-eq类似于JavaScript中的===。这是否正确?

之所以会发生这种情况,是因为PowerShell试图将比较的右侧强制为左侧的类型

$alluser |?{$\.Title-eq$true}
此操作失败,因为它与执行以下操作相同:

$alluser |?{$\ Title-eq“True”}
要了解原因,请尝试强制转换:
[string]$true

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

$alluser |?{$\.Title}
它会像预期的那样起作用

同样,当您这样做时:

$alluser |?{$\.Title-gt 0}
这就像做:

$alluser |?{$\.Title-gt“0”}
从理论上讲,这是一个危险得多的比较,因为以开头的标题(比如
@
)将返回false。实际上,标题不太可能以小于
0
的字符值开头,因为所有字母(大写和小写)的值都较高。但我没有考虑国际化

虽然为了我自己和我以后的人, 你会编辑你的帖子来解释为什么{$\.Title}是 更好的方法

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

  • 它很短
  • 它不包含任何嵌入常量。不确定这有多重要,但出错的可能性较小
  • (在我看来)很清楚你在测试什么,因为这是在许多语言中测试它的常用方法
  • 它与
    $null
    和空字符串一起工作
还有其他方法:

$alluser |?{![String]::IsNullOrEmpty($\u0.Title)}
$allUsers |?{$\ Title.Length-gt 0}
$allUsers |?{$\.Title-ne”“}#将包括$null标题
$allUsers |?{$\ Title-ne$null}将包含空字符串标题
还有一点我没有提到:您应该在
Get ADUser
-Filter
属性中进行比较,理想情况下,您应该只询问您需要的属性:

$alluser=Get ADUser-Filter{-not(类似于“*”)的标题)}-Properties-Title

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

明白了。这是有道理的。虽然为了我自己,也为了我之后的人,你能编辑一下你的帖子来解释一下为什么{$\uuu.Title}是更好的方法吗?
$allUsers | ? {$_.Title -eq $true}
$allUsers | ? {$_.Title -gt 0}