명령 프롬프트에서 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에 전달하려면 어떻게 해야 합니까?
보다 명확한 용도는 스위치 파라미터를 사용하는 것입니다.그 후 Unified 파라미터가 존재하는 것만으로 파라미터가 설정되어 있는 것이 됩니다.
다음과 같은 경우:
param (
[int] $Turn,
[switch] $Unify
)
powershell.exe가 스크립트 하지 않는 인수를 완전히 평가하지 않는 .-File
파라미터가 사용됩니다.히,는$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
를 '알겠습니다'로 .[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
이는 오래된 질문이지만 PowerShell 설명서에 이에 대한 답이 있습니다.저도 같은 문제가 있어서 이번에 RTFM이 실제로 해결했습니다.거의.
File 파라미터의 매뉴얼에는 다음과 같이 기재되어 있습니다.희소하지만 스위치파라미터에 부울값을 지정해야 할 경우가 있습니다.스위치 파라미터의 부울값을 File 파라미터 값으로 지정하려면 파라미터의 이름과 값을 다음과 같이 곱슬곱슬한 괄호로 묶습니다.-File\Get-Script.ps1 {-All:$False}"
나는 이렇게 써야 했다.
PowerShell.Exe -File MyFile.ps1 {-SomeBoolParameter:False}
PowerShell 4.0에서는 true/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의 인수에서는 부울값을 단순한 문자열 :)로 전달할 수 있습니다.
bash에서 Linux에서 powershell 스크립트를 실행해도 동일한 문제가 발생합니다.Lars와 거의 비슷하게 해결했습니다.WA의 답변:
동작:
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
Windows PowerShell v5.1 (최신 및 최신 버전) / PowerShell (Core) 7.3.3에서 기존 답변을 요약 및 보완하려면 다음 절차를 따릅니다.
David Mohundro의 답변에 따르면 PowerShell에서는 파라미터 대신 파라미터를 사용해야 합니다.PowerShell에서는 스위치 이름의 -Unify
유무(지정 유무와 미지정)가 값을 의미하므로 원래 문제가 해소됩니다.
단, 특히 명령줄을 프로그래밍 방식으로 작성하는 경우 스위치 값을 명시적으로 전달해야 하는 경우가 있습니다.
PowerShell Core 7+에서는 원래의 문제(XLII 황제의 답변에 기재)가 수정되었습니다.
, ★★★★★★★★★★★★★★★★★★★★★★★★★★★★.$true
[switch]
" " 라는 이름의 -Unify
이제 다음을 쓸 수 있습니다.
pwsh -File .\RunScript.ps1 -Unify:$true # !! ":" separates name and value, no space
수 은 다음과 같습니다.$false
,false
,$true
,true
, 패스하는 「」, 「」에 해 주세요0
★★★★★★★★★★★★★★★★★」1
동작하지 않습니다.
과 「」의 값이 것에 해 주세요.:
둘 사이에 공백이 없어야 합니다.
: ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★[bool]
" " 대신 "[switch]
(일반적으로 사용하지 않는 것이 좋습니다), 같은 구문을 사용해야 합니다.그럼에도 불구하고.-Unify $false
현재 GitHub호 10838을 참조할 수 없습니다.
Windows PowerShell에서는 원래 문제가 지속되며, Windows PowerShell이 더 이상 활발하게 개발되지 않는다는 점을 고려할 때 수정될 가능성은 낮습니다.
Lars에서 제안하는 회피책WA의 답변은 이 글에서 수정된 공식 도움말 토픽에 기초하고 있지만 v5.1에서는 작동하지 않습니다.
대신 을 사용하는 것이 효과적인 유일한 회피책입니다.
:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true"
★★★★★★★★★★★★★★★★ -Command
PowerShell 코드 일부를 효과적으로 전달하고, 이 코드는 평소와 같이 평가되며 PowerShell 내부로 전달됩니다.$true
★★★★★★★★★★★★★★★★★」$false
동작한다(단, 동작하지 않는다) true
★★★★★★★★★★★★★★★★★」false
로 받아들여지고 있어요.-File
를 참조해 주세요.
경고:
「」를 사용합니다.
-Command
에 인수가 경우 등, 인수의 가 있습니다.$
( 포함)-File
, 인수는 리터럴입니다).「」를 사용합니다.
-Command
다른 종료 코드가 발생할 수 있습니다.
PowerShell에서 부울 파라미터는 변수 앞에 유형을 언급함으로써 선언할 수 있습니다.
function GetWeb() {
param([bool] $includeTags)
........
........
}
$true | $false를 전달하면 값을 할당할 수 있습니다.
GetWeb -includeTags $true
invoke-command를 사용하는 함수에 스크립트를 전달했을 때도 비슷한 현상이 있었습니다.큰따옴표 대신 작은따옴표로 명령어를 실행했습니다.이렇게 하면 문자열 리터럴이 되기 때문입니다. 'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';
이 테스트에 따르면 함수에서 부울이 될 것으로 예상되는 파라미터에는 기본값 지정이 작동하지 않습니다.
[switch] 타입을 사용할 수도 있고 부울 타입을 사용할 수도 있습니다.다음과 같이 함수 시작 부분에서 기본값을 지정해야 합니다.
Function nullRules {
Param
(
[Parameter(Mandatory=$false)] $boolWins
)
if ([DBNull]::Value.Equals($boolWins)) {$boolWins=$false}
....
....
}
를 사용할 수도 있습니다.0
위해서False
또는1
위해서True
이 에러 메시지에서는, 실제로 다음과 같은 것을 나타내고 있습니다.
매개 변수 'Unify'에 대한 인수 변환을 처리할 수 없습니다.값을 변환할 수 없습니다.
"System.String"
타이핑하다"System.Boolean"
, 이 유형의 파라미터는 부울 또는 숫자만 사용할 수 있습니다.$true
,$false
대신, 1 또는 0 입니다.
자세한 내용은 부울값 및 연산자에 대한 이 MSDN 기사를 참조하십시오.
언급URL : https://stackoverflow.com/questions/5079413/how-to-pass-boolean-values-to-a-powershell-script-from-a-command-prompt
'programing' 카테고리의 다른 글
PowerShell 및 -contains 연산자 (0) | 2023.04.08 |
---|---|
데이터 손실 없이 SQL Server 데이터베이스의 열 데이터 유형을 변경하는 방법 (0) | 2023.04.08 |
HTML Agility 팩 사용 방법 (0) | 2023.04.08 |
PowerShell에서 여러 파라미터를 하나의 함수로 전달하려면 어떻게 해야 합니까? (0) | 2023.04.08 |
nvarchar(최대)와 NText (0) | 2023.04.08 |