반응형
파워셸:명령줄에서 powershell을 호출할 때 변수를 스위치 매개 변수로 전달하려면 어떻게 해야 합니까?
일반적으로 스위치 매개 변수의 지정을 일부 변수로 연기하려면 WhatIf 매개 변수에 표시된 식을 스위치 매개 변수에 전달할 수 있습니다.
test.ps1
param ( [string] $source, [string] $dest, [switch] $test )
Copy-Item -Path $source -Destination $dest -WhatIf:$test
이를 통해 스위치 작업 시 뛰어난 유연성을 얻을 수 있습니다.그러나 powershell을 cmd.exe 등으로 호출하면 다음과 같은 결과가 발생합니다.
D:\test>powershell -file test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true
D:\test\test.ps1 : Cannot process argument transformation on
parameter 'test'. Cannot convert value "System.String" to type "System.Manageme
nt.Automation.SwitchParameter", parameters of this type only accept booleans or
numbers, use $true, $false, 1 or 0 instead.
At line:0 char:1
+ <<<<
+ CategoryInfo : InvalidData: (:) [test.ps1], ParentContainsError
RecordException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,test.ps1
그러나 통과 시 동일한 결과가 나타납니다.-test:true
,그리고.-test:1
왜 안 되는 거지?파워셸의 타입 변환 시스템은 자동으로 이 스트링들을 쿨이나 스위치로 변환할 수 있는 것으로 인식하고 변환해야 하지 않을까요?
이것은 빌드 시스템과 같은 다른 시스템에서 파워셸 스크립트를 호출할 때 명령 문자열에 스위치를 포함할지 여부를 결정하기 위해 복잡한 흐름 제어 구조를 구성해야 한다는 것을 의미합니까?이는 지루하고 오류가 발생하기 쉬운 것으로 보이며, 이로 인해 그렇지 않다고 생각하게 됩니다.
이 동작은 연결 시 버그로 보고되었습니다.해결 방법은 다음과 같습니다.
powershell ./test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true
스위치의 IsPresent 속성을 사용합니다.예:
function test-switch{
param([switch]$test)
function inner{
param([switch]$inner_test)
write-host $inner_test
}
inner -inner_test:$test.IsPresent
}
test-switch -test:$true
test-switch -test
test-switch -test:$false
True
True
False
그런데 스크립트가 아닌 기능을 사용해서 테스트하기가 더 쉬울 것 같습니다.
언급URL : https://stackoverflow.com/questions/11367685/powershell-how-do-i-pass-variables-to-switch-parameters-when-invoking-powershel
반응형
'programing' 카테고리의 다른 글
전화기의 Google Play 스토어 앱에서 "Rate This App" 링크 (0) | 2023.09.03 |
---|---|
SQL Logic 연산자 우선 순위:And 및 Or (0) | 2023.09.03 |
UITableView 스크롤 위치를 저장하려면 어떻게 해야 합니까? (0) | 2023.09.03 |
PHP 코드 내에서 MySQL 저장 프로시저를 어떻게 호출합니까? (0) | 2023.09.03 |
CALayer를 위한 애니메이션 종료 콜백? (0) | 2023.09.03 |