배치 파일에서 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이 실제로 그것을 해결했습니다. 거의.
-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
(그러나 작동 하지 true
과 false
같은 이제와 인정, -File
).
주의 사항 :
-
을 사용하면
-Command
인수에$
문자가 포함 된 경우와 같은 추가 해석이 발생할 수 있습니다 . (와 함께-File
인수는 리터럴입니다 ). -
를 사용
-Command
하면 다른 종료 코드 가 발생할 수 있습니다 .