为什么在使用 -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
。为什么要满足这个条件?我认为这可能是因为它区分大小写,但是即使我修改条件以捕捉确切的大小写,它仍然被满足。
如果您的变量应该只有 val1
或 val2
,您必须使用 -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
前缀的变体都表现得像它们的无前缀基本形式)。
我正在使用 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
。为什么要满足这个条件?我认为这可能是因为它区分大小写,但是即使我修改条件以捕捉确切的大小写,它仍然被满足。
如果您的变量应该只有 val1
或 val2
,您必须使用 -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
前缀的变体都表现得像它们的无前缀基本形式)。