gpt4 book ai didi

powershell - 为什么 -Match 运算符有时返回匹配字符串,有时返回 bool 值?

转载 作者:行者123 更新时间:2023-12-02 17:59:13 25 4
gpt4 key购买 nike

这是我在Powershell中最喜欢的运算符,但有时我觉得它鄙视我!!

假设我在 $Clipboard 中有一个像这样的字符串:

PowerShell Documentation - PowerShell | Microsoft Learn
https://learn.microsoft.com/en-us/powershell/

Welcome to Python.org
https://www.python.org/

GitHub
https://github.com/

调用:

$Clipboard.trim()  -split '\n' -NotMatch "^$"

返回匹配的实际字符串,而不是 bool 值:

PowerShell Documentation - PowerShell | Microsoft Learn
https://learn.microsoft.com/en-us/powershell/
Welcome to Python.org
https://www.python.org/
GitHub
https://github.com/

但是如果我做这样的事情:

$Clipboard.trim()  -split '\n' -NotMatch "^$"| % {$Title = $_ -Match "https?:|//www\." 
$Title
}

我得到 bool 值:

False
True
False
True
False
True

我现在开始避免 -Match,请发送帮助。

最佳答案

这是一个general feature of PowerShell's comparison operators :

  • 使用标量(单个)LHS 操作数,它们返回 [bool]结果($true$false)。

  • 使用数组(集合)LHS 操作数,它们充当过滤器>返回那些匹配的LHS元素,(总是)作为数组。

关于-match运算符,具体来说,请注意 automatic $Matches variable ,其中包含有关匹配内容的信息,仅使用标量 LHS 进行填充。


iRon指出,PowerShell 的隐式 bool 强制规则还允许您将数组值 LHS 的操作用作条件;例如:

# -> 'MATCH found',
# because the -match operation returns @('foo'), i.e.
# the subarray of matching items, and [bool] @('foo') is $true.
if (@('foo', 'bar') -match 'f') { 'MATCH found' } else { 'NO match' }

# -> 'NO match',
# because the -match operation returns @(), i.e. an *empty array,
# and [bool] @() is $false
if (@('foo', 'bar') -match 'x') { 'MATCH found' } else { 'NO match' }

但是,也存在陷阱,即当过滤操作返回单个结果时,在强制转换时恰好是$false[bool] 请注意,即使在这种情况下返回单元素数组,PowerShell 也会将其视为此中唯一的元素上下文:

# !! -> 'NO match', even though a match *was* found: 
# !! The -match operation returns @('') and [bool] @('') is the
# !! same as [bool] '' and therefore $false.
if (@('', 'bar') -match 'foo|^$') { 'MATCH found' } else { 'NO match' }

# !! -> 'NO match', even though a match *was* found:
# !! The -eq operation returns @(0) and [bool] @(0) is
# !! the same as [bool] 0 and therefore $false.
if (@(0, 1) -eq 0) { 'MATCH found' } else { 'NO match' }

如果返回两个或更多结果,则强制结果始终 $true,但与数组元素的值无关(类似于 no 结果,即空返回数组,总是产生 $false)。

PowerShell 到 bool 值转换规则的摘要位于 this answer 的底部部分.

关于powershell - 为什么 -Match 运算符有时返回匹配字符串,有时返回 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74857447/

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