[scripting] 명령 프롬프트에서 PowerShell 스크립트에 부울 값을 전달하는 방법

배치 파일에서 PowerShell 스크립트를 호출해야합니다. 스크립트에 대한 인수 중 하나는 부울 값입니다.

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify $false

다음 오류와 함께 명령이 실패합니다.

Cannot process argument transformation on parameter 'Unify'. Cannot convert value "System.String" to type "System.Boolean", parameters of this type only accept booleans or numbers, use $true, $false, 1 or 0 instead.

At line:0 char:1
+  <<<< <br/>
+ CategoryInfo          : InvalidData: (:) [RunScript.ps1], ParentContainsErrorRecordException <br/>
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,RunScript.ps1

지금은 내 스크립트 내에서 부울 변환 문자열을 사용하고 있습니다. 그러나 부울 인수를 PowerShell에 어떻게 전달할 수 있습니까?



답변

-File매개 변수를 사용할 때 powershell.exe가 스크립트 인수를 완전히 평가하지 않는 것으로 보입니다 . 특히, $false인수는 아래 예제와 유사한 방식으로 문자열 값으로 처리됩니다.

PS> function f( [bool]$b ) { $b }; f -b '$false'
f : Cannot process argument transformation on parameter 'b'. Cannot convert value
"System.String" to type "System.Boolean", parameters of this type only accept
booleans or numbers, use $true, $false, 1 or 0 instead.
At line:1 char:36
+ function f( [bool]$b ) { $b }; f -b <<<<  '$false'
    + CategoryInfo          : InvalidData: (:) [f], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,f

를 사용하는 대신 -File시도해 볼 수 있습니다. -Command그러면 호출이 스크립트로 평가됩니다.

CMD> powershell.exe -NoProfile -Command .\RunScript.ps1 -Turn 1 -Unify $false
Turn: 1
Unify: False

David가 제안 했듯이 switch 인수를 사용하는 것도 더 관용적이어서 부울 값을 명시 적으로 전달할 필요를 제거하여 호출을 단순화합니다.

CMD> powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify
Turn: 1
Unify: True


답변

보다 명확한 사용법은 대신 스위치 매개 변수를 사용하는 것입니다. 그런 다음 Unify 매개 변수가 있다는 것만으로 설정되었음을 의미합니다.

이렇게 :

param (
  [int] $Turn,
  [switch] $Unify
)


답변

이것은 오래된 질문이지만 실제로 PowerShell 설명서에 이에 대한 답변이 있습니다. 나는 똑같은 문제가 있었고 한 번 RTFM이 실제로 그것을 해결했습니다. 거의.

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe

-File 매개 변수에 대한 문서에는 “드물게 스위치 매개 변수에 대한 부울 값을 제공해야 할 수도 있습니다. File 매개 변수의 값에있는 스위치 매개 변수에 대한 부울 값을 제공하려면 매개 변수 이름과 값을 다음과 같은 중괄호 : -File. \ Get-Script.ps1 {-All : $ False} “

다음과 같이 작성해야했습니다.

PowerShell.Exe -File MyFile.ps1 {-SomeBoolParameter:False}

따라서 true / false 문 앞에 ‘$’가 없으며 PowerShell 4.0에서 저에게 효과적이었습니다.


답변

매개 변수 유형을 다음과 같이 설정해보십시오 [bool].

param
(
    [int]$Turn = 0
    [bool]$Unity = $false
)

switch ($Unity)
{
    $true { "That was true."; break }
    default { "Whatever it was, it wasn't true."; break }
}

이 예는 기본 설정 $Unity$false아무런 입력이 제공되지 않는 경우.

용법

.\RunScript.ps1 -Turn 1 -Unity $false


답변

부울 값을 매개 변수로 사용 / 설정하는 가장 좋은 방법은 PS 스크립트에서 다음과 같이 사용하는 것입니다.

Param(
    [Parameter(Mandatory=$false)][ValidateSet("true", "false")][string]$deployApp="false"
)

$deployAppBool = $false
switch($deployPmCmParse.ToLower()) {
    "true" { $deployAppBool = $true }
    default { $deployAppBool = $false }
}

이제 다음과 같이 사용할 수 있습니다.

.\myApp.ps1 -deployAppBool True
.\myApp.ps1 -deployAppBool TRUE
.\myApp.ps1 -deployAppBool true
.\myApp.ps1 -deployAppBool "true"
.\myApp.ps1 -deployAppBool false
#and etc...

따라서 cmd의 인수에서 부울 값을 간단한 문자열로 전달할 수 있습니다. :).


답변

PowerShell에서 부울 매개 변수는 변수 앞에 해당 유형을 언급하여 선언 할 수 있습니다.

    function GetWeb() {
             param([bool] $includeTags)
    ........
    ........
    }

$ true |를 전달하여 값을 할당 할 수 있습니다. $ false

    GetWeb -includeTags $true


답변

Windows PowerShell v5.1 / PowerShell Core 7.0.0-preview.4 부터 기존 답변 요약하고 보완 하려면 다음을 수행 하십시오 .

David Mohundro의 대답 [bool]매개 변수 대신 PowerShell[switch] 에서 매개 변수를 사용해야한다고 정당하게 지적 합니다 . 여기서 스위치 이름존재와 부재 ( -Unify지정된 대 지정 되지 않음 )는 값을 의미 하므로 원래 문제가 사라집니다.


그러나 때때로 , 특히 프로그래밍 방식 으로 명령 줄을 구성하는 경우 스위치 값을 명시 적으로 전달해야 할 수도 있습니다 .


PowerShell Core 에서 원래 문제 ( Emperor XLII의 답변에 설명 됨 ) 수정 되었습니다 .

즉, 이름 이 지정된 매개 변수에 $true명시 적 으로 전달 하려면 이제 다음과 같이 작성할 수 있습니다.[switch]-Unify

pwsh -File .\RunScript.ps1 -Unify:$true  # !! ":" separates name and value, no space

다음 값을 사용할 수 있습니다 : $false, false, $true, true통과하지만, 참고 0또는 것은 1수행 하지 작업.

스위치 이름이로 값과 어떻게 분리되고 둘 사이에 공백: 이 없어야합니다 .

참고 : 일반적으로해서는 안되는 [bool]a 대신 매개 변수 를 선언하는 경우 [switch]동일한 구문을 사용해야합니다. 작동 -Unify $false 해야 하지만 현재이 GitHub 문제가 표시되지 않습니다 .


에서 Windows PowerShell을원래 문제의이 지속 Windows PowerShell을 더 이상 활발하게 개발되지 않도록 주어진 – -, 고정하기가 어렵다.

  • LarsWA의 답변 에서 제안한 해결 방법 은이 글을 쓰는 시점 에서 공식 도움말 항목 을 기반으로하지만 v5.1 에서는 작동 하지 않습니다.

    • 이 GitHub 문제 는 문서 수정을 요청하고 해결 방법의 비 효율성을 보여주는 테스트 명령도 제공합니다.
  • -Command대신 사용 하는 -File것이 유일한 효과적인 해결 방법입니다 .

:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true" 

으로 -Command당신이 효과적으로 전달하는 PowerShell을 코드의 조각 후 평소와 같이 평가, – 그리고 PowerShell을 통과 내부 $true$false(그러나 작동 하지 truefalse같은 이제와 인정, -File).

주의 사항 :

  • 을 사용하면 -Command인수에 $문자가 포함 된 경우와 같은 추가 해석이 발생할 수 있습니다 . (와 함께 -File인수는 리터럴입니다 ).

  • 를 사용 -Command하면 다른 종료 코드 가 발생할 수 있습니다 .

자세한 내용은 이 답변이 답변을 참조하십시오 .