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


103

배치 파일에서 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에 어떻게 전달할 수 있습니까?

답변:


57

-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

6
"-File"매개 변수를 유지해야하고 switch 인수로 변경할 수 없지만 전송되는 문자열 값을 제어 할 수있는 사람들 (나와 같은)의 경우 가장 간단한 해결책은 매개 변수를 부울 using [System.Convert] :: ToBoolean ($ Unify); 그러면 문자열 값은 "True"또는 "False"여야합니다.
Chris Haines

187

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

이렇게 :

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

21
이것은 받아 들여진 대답이어야합니다. 토론을 더 진행하기 위해 다음과 같이 다른 매개 변수와 같이 기본값을 설정할 수 있습니다.[switch] $Unify = $false
Mario Tacke 2015 년

나는 Boolean이 갈 길이라고 확신했기 때문에이 대답을 간과했습니다. 그렇지 않습니다. Switch는 부울의 기능을 캡슐화하고 이러한 종류의 오류를 중지합니다. ""False "값을"System.Management.Automation.ParameterAttribute "유형으로 변환 할 수 없습니다. 스위치가 저를 위해 작동했습니다.
TinyRacoon

2
@MarioTacke 스크립트를 호출 할 때 스위치 매개 변수를 지정하지 않으면 자동으로로 설정됩니다 $false. 따라서 명시 적으로 기본값을 설정할 필요가 없습니다.
doubleDown

이 제안은 매우 잘 작동했습니다. 매개 변수 중 하나를 [bool]에서 [switch]로 업데이트 할 수 있었고 이로 인해 작업 스케줄러를 통해 인수를 성공적으로 전달할 수있었습니다.
JustaDaKaje

12

이것은 오래된 질문이지만 실제로 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에서 저에게 효과적이었습니다.


1
공유 해주셔서 감사합니다! 내 문제를 완벽하게 해결했습니다.
Julia Schwarz

1
답변의 링크는 내용이 변경된 것 같습니다. 그러나, 나는 답을 찾을 여기
Slogmeister 네르에게

현재 문서 링크 about_powershell.exe 또는 그냥 rung powershell -h합니다.
세스

이 어색한 해결 방법이 효과가 있었다는 사실에 놀랐습니다. Windows PowerShell v5.1에는 없습니다 (리딩이 있거나없는 경우도 마찬가지입니다 $). 또한 PowerShell Core 에서는 더 이상 필요하지 않습니다 . 문서 수정을 요청했습니다. 참조 github.com/MicrosoftDocs/PowerShell-Docs/issues/4964
mklement0

11

매개 변수 유형을 다음과 같이 설정해보십시오 [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

1
XLII 황제의 답변과 -File매개 변수 에 대한 귀하의 의견 은 원래 질문의 모든 측면을 다루어야합니다. 누군가가 기본값 제공에 대한 내 힌트를 유용하게 사용할 수 있기 때문에 내 대답을 남길 것입니다.
Filburt 2013

잘 했어요 Filburt. 귀하의 답변으로 인해 이미 필요한 값 $ false로 지정된 기본값이있는 내 스크립트를 확인하게되었습니다 (몇 년 전에 작성했고 이에 대해 모두 잊었습니다). 따라서 문제가있는 부울 매개 변수를 지정할 필요도 없습니다. 지금 명령 줄. 우수 :)
Zeek2

5

부울 값을 매개 변수로 사용 / 설정하는 가장 좋은 방법은 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의 인수에서 부울 값을 간단한 문자열로 전달할 수 있습니다. :).


2

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

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

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

    GetWeb -includeTags $true

명명 된 입력 인수를 명시 적으로 전달하는 것만으로도 효과가있었습니다. 감사합니다 Ahmed
Steve Taylor

0

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하면 다른 종료 코드 가 발생할 수 있습니다 .

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


0

invoke-command를 사용하여 스크립트를 함수에 전달할 때 비슷한 것이 있습니다. 큰 따옴표 대신 작은 따옴표로 명령을 실행했습니다. 그러면 문자열 리터럴이되기 때문입니다.'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';


0

bash에서 Linux에서 powershell 스크립트를 실행하면 동일한 문제가 발생합니다. LarsWA의 답변과 거의 동일하게 해결했습니다.

일:

pwsh -f ./test.ps1 -bool:true

작동하지 않는:

pwsh -f ./test.ps1 -bool=1
pwsh -f ./test.ps1 -bool=true
pwsh -f ./test.ps1 -bool true
pwsh -f ./test.ps1 {-bool=true}
pwsh -f ./test.ps1 -bool=$true
pwsh -f ./test.ps1 -bool=\$true
pwsh -f ./test.ps1 -bool 1
pwsh -f ./test.ps1 -bool:1

-3

0for False또는 1for를 사용할 수도 있습니다 True. 실제로 오류 메시지에서 다음을 제안합니다.

매개 변수 'Unify'에서 인수 변환을 처리 할 수 ​​없습니다. 값을 변환 할 수 없습니다 "System.String"유형 "System.Boolean"이 유형의 매개 변수는 논리 값 또는 숫자, 사용 동의 $true, $false, 1 또는 0 대신합니다.

자세한 내용은 부울 값 및 연산자 에 대한 MSDN 문서를 확인하십시오 .


10
작동하지 않습니다. 정수 1 또는 0을 예상하지만 전달하면 -File문자열로 해석되므로 동일한 오류가 발생합니다.
Erti-Chris Eelmaa

제안이 작동하지 않기
때문에이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.