programing

파워셸:명령줄에서 powershell을 호출할 때 변수를 스위치 매개 변수로 전달하려면 어떻게 해야 합니까?

goodsources 2023. 9. 3. 16:15
반응형

파워셸:명령줄에서 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

반응형