programing

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

cafebook 2023. 4. 8. 09:13
반응형

명령 프롬프트에서 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이 실제로 해결했습니다.거의.

https://learn.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}

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이 더 이상 활발하게 개발되지 않는다는 점을 고려할 때 수정될 가능성은 낮습니다.

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

★★★★★★★★★★★★★★★★ -CommandPowerShell 코드 일부를 효과적으로 전달하고, 이 코드는 평소와 같이 평가되며 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

반응형