문제
PowerShell에서 다소 이상한 동작이 보입니다. 사용자 지정 함수를 예상한 대로 평가하려면 "괄호 래퍼"가 필요한 것 같습니다.간단한 PowerShell 함수를 사용하면 다음과 같습니다.
function Return-True { return $true }
그런 다음 이를 호출하는 몇 가지 샘플 코드를 살펴보겠습니다.
PS C:\> Return-True
True
PS C:\> Return-True -eq $false
True
PS C:\> (Return-True) -eq $false
False
아이디어?코멘트?
해결책
PowerShell이 토큰을 볼 때 Return-True
이를 명령으로 식별하고 명령문이 평가되거나 끝날 때까지 다른 모든 것은 함수에 전달되는 인수입니다. Return-True
.
다음을 수행하면 실제로 이를 확인할 수 있습니다.
PS > function Return-True { "The arguments are: $args"; return $true }
PS > Return-True -eq $false
The arguments are: -eq False
True
이것이 바로 다음의 모든 항목이 'True'를 반환하는 이유입니다. 왜냐하면 여러분이 보고 있는 모든 것은 호출의 결과이기 때문입니다. Return-True
다양한 주장으로:
PS > Return-True -eq $false
True
PS > Return-True -ne $false
True
PS > Return-True -eq $true
True
PS > Return-True -ne $true
True
사용 (Return-True)
PowerShell이 함수를 인수 없이 평가하도록 강제합니다.
다른 팁
두 번째 줄은 부울 평가를 수행하지 않습니다. 현으로 똑같은 일을하면 어떻게되는지보십시오.
PS C:\> function Return-True { return "True string" }
PS C:\> Return-True
True string
PS C:\> Return-True -eq "False string"
True string
PS C:\> (Return-True) -eq "False string"
False
두 번째 줄은 단순히 함수의 값을 반환하고 비교하지 않는 것입니다. 왜이 동작이 일어나고 있는지 정확히 잘 모르겠지만, "true"및 "false"로 변환되는 부울 값을 사용할 때보 다 동작을 쉽게 볼 수 있습니다.
PowerShell v2의 편집기를 사용하는 경우 첫 번째 예제에서 -eq가 파란색이라는 것을 알 수 있습니다. 두 번째 예제에서 -eq는 연산자이기 때문에 -eq가 회색이기 때문입니다.
또한 v2에서는 cmdletbinding 및 param과 함께 인수에 대해 엄격 할 수 있습니다.
function Return-True
{
[CmdletBinding()]
param()
return $true
}
Return-True -eq $false
Return-True -eq $false
Return-True : A parameter cannot be found that matches parameter name 'eq'.
At line:7 char:16
+ Return-True -eq <<<< $false
+ CategoryInfo : InvalidArgument: (:) [Return-True], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Return-True