FuncOne() - 和FuncTwo()不工作

时间:2017-06-07 13:00:38

标签: windows powershell windows-server-2012-r2 powershell-v5.0

这是我的代码:

if (FuncOne($valOne) -and FuncTwo($valTwo)) {
    ...
}

当这两个函数都计算为$false时,if语句中的代码仍会执行。这是为什么?这也不能按预期工作:

if (FuncOne($valOne) -eq $true -and FuncTwo($valTwo) -eq $true) {
    ...
}

以这种方式书写时,它按预期工作。

$a = FuncOne($valOne)
$b = FuncTwo($valTwo)

if($a -and $b) {
    ...
}

发生了什么事?

2 个答案:

答案 0 :(得分:3)

这是一个语法问题。

在PowerShell中调用函数的正确语法不是:

functionName($arg1[,$arg2,$arg3])

而是:

functionName [-parameterName1] $arg1 [[-parameterName2] $arg2]

现在,让我们将其应用于您的if()示例表达式:

FuncOne $valOne -and FuncTwo $valTwo 

您会注意到显式参数名称(-ParameterName)和运算符(-and)完全无法区分 - 解析器无法判断是否应该解释-and作为参数名称或运算符。另外,字符串文字FuncTwo也可以被解释为参数参数,这正是发生的事情。

为了使解析器知道您打算将表达式视为两个单独的表达式,强制使用()评估顺序:

if ((FuncOne $valOne) -and (FuncTwo $valTwo)) {
    # They both returns a truthy value
}

答案 1 :(得分:2)

你实际上需要将函数放在括号中以便调用它:

if ((FuncOne($valOne)) -and (FuncTwo($valTwo))) {
    ...
}