为什么在使用 -notMatch 条件验证参数时会满足此条件?

Why is this condition being met when verifying parameters using the -notMatch condition?

我正在使用 Powershell 验证传递到发布管道的参数。我作为管道变量传递的参数是 val1。下面是我的代码:

if ("$(Value)" -notMatch "val1" -or "$(Value)" -notMatch "val2"){
  Write-Host "$(Value) must be val1 || val2"
  Write-Host "Value of param: "$(Value)""
  exit 1
}

当我打印时,我的值是状态 val1。为什么要满足这个条件?我认为这可能是因为它区分大小写,但是即使我修改条件以捕捉确切的大小写,它仍然被满足。

如果您的变量应该只有 val1val2,您必须使用 -and 而不是 -or

if ("$(Value)" -notMatch "val1" -and "$(Value)" -notMatch "val2"){
  Write-Host "$(Value) must be val1 || val2"
  Write-Host "Value of param: "$(Value)""
  exit 1
}

改为

if ("$(Value)" -notMatch "val1" -and "$(Value)" -notMatch "val2"){
  Write-Host "$(Value) must be val1 || val2"
  Write-Host "Value of param: "$(Value)""
  exit 1
}

注意:问题和下面的代码中的 $(Value)Azure 管道宏 ,而不是 PowerShell 变量引用 例如 $Value。由于这样的宏在 之前 被扩展到它的值,PowerShell 看到它,将它包含在 "..." 中 - 同样,如问题和下面的代码 - 确保没有语法错误如果该值恰好包含空格或其他 PowerShell 元字符,则会发生。

解释逻辑错误,但可能还有一个问题:

  • -match(及其 -notmatch 变体),regular-expression matching operator 匹配 substrings 默认 ,因此 "$(Value)" 扩展到 aval1,例如,也会错误地通过测试。

  • 用于文字全值集合的比较,您可以使用 -in 运算符 (请注意,-contains 仅在操作数相反的情况下具有相同的目的)和它的变体,在这种情况下特别是 -notin ;使用 -cnotin 进行大小写 敏感 比较。

# Note: `$(Value)` is an *Azure pipeline macro (variable)*, which is expanded
#       *before* PowerShell sees the code.
#       In pure PowerShell code, the equivalent would be just `$Value`
if ("$(Value)" -notin 'val1', 'val2') {
  Write-Error '$(Value) must be val1 || val2'
  exit 1
}

I thought perhaps it was because its case-sensitive however

请注意,所有 PowerShell 运算符默认情况下不区分大小写(当它们运行时在文本上);在大多数情况下,PowerShell 默认不区分大小写。

大小写-敏感操作需要使用c前缀的变体,例如-cmatch.

可选地,为了更清楚地表明意图,您可以通过使用 i 前缀变体来表明大小写 不敏感 操作,例如 -imatch (所有带 i 前缀的变体都表现得像它们的无前缀基本形式)。