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