IF语句仍然被触发

时间:2019-07-16 13:08:03

标签: powershell scripting

我正在做运动,但我不明白为什么它不起作用。

如果字符串仅包含“!”,它仍会触发第一个if语句。

Function Get-BobResponse() {
    [CmdletBinding()]
    Param(
        [string]$HeyBob
    )

    if(($HeyBob -match "!") -and ($HeyBob -like "*?*")){
        return "Calm down, I know what I'm doing!"
    }

    if($HeyBob -match "!"){
        return "Whoa, chill out!"
    }

    if($HeyBob -Like "*?*"){
        return "Sure"
    }

    if($HeyBob -eq ""){
        return "Fine. Be that way!"
    }
    else{
        return "Whatever"
    }
}

2 个答案:

答案 0 :(得分:4)

此通配符模式:

*?*

将匹配任何字符串至少一个字符-因为?是一个元字符,表示“完全是任何字符中的一个”。

您可以使用WildcardPattern.Escape()来转义元字符或组:

$questionMark = [WildcardPattern]::Escape('?')
$HeyBob -like "*$questionMark*"

在单引号(即文字)字符串中,您可以使用反引号(`)手动对其进行转义:

$HeyBob -like '*`?*'

请注意,您必须在双引号中将双引号转义(因为PowerShell对可扩展字符串通配符模式都使用了反引号)

$HeyBob - like "*``?*"

在这两种情况下,您也都可以使用正则表达式,尽管在这种情况下,您仍然需要转义?(因为它是正则表达式中的特殊量词):

$HeyBob -match '!' -and $HeyBob -match [regex]::Escape('?')

答案 1 :(得分:2)

表达式:

$HeyBob -match "!"

进行正则表达式匹配,并且$HeyBob!时将表示为true

下一步:

$HeyBob -like "*?*"

是一个通配符,表示匹配零个或多个字符(第一个*),然后是一个字符(与!匹配),然后是零个或多个字符(第二个*)。与!的比赛。

当两者都匹配时,您最终得到$true -and $true,这是正确的,并导致执行第一个if语句。