programing

Powershell 비위치,

subpage 2023. 9. 1. 21:00
반응형

Powershell 비위치,

이 기본 패턴을 따르는 인수를 허용하는 파워셸(2.0) 스크립트를 만들려고 합니다.

.\{script name} [options] PATH

여기서 옵션은 임의의 수의 선택적 매개변수입니다. 자세한 내용은 '-v' 행을 따라 생각하십시오.PATH 인수는 마지막에 전달된 인수와 동일하며 필수입니다.옵션 없이 하나의 인수만 사용하여 스크립트를 호출할 수 있으며, 이 인수는 경로로 간주됩니다.선택적 매개 변수만 포함하고 위치가 지정되지 않은 매개 변수 목록을 설정하는 데 문제가 있습니다.

이 빠른 스크립트는 내가 안고 있는 문제를 보여줍니다.

#param test script
Param(
    $firstArg,
    $secondArg,
    [switch]$thirdArg,
    [Parameter(ValueFromRemainingArguments = $true)]
    $remainingArgs)

write-host "first arg is $firstArg"
write-host "second arg is $secondArg"
write-host "third arg is $thirdArg"
write-host "remaining: $remainingArgs"

그렇게 불리는 경우:

.\param-test.ps1 firstValue secondValue

스크립트 출력:

first arg is firstValue
second arg is secondValue
third arg is False
remaining:

내가 만들려고 하는 동작은 두 인수가 모두 선택적 매개 변수를 통과하고 나머지 Args 변수로 끝날 것입니다.

이 질문/답변은 원하는 동작을 달성할 수 있는 방법을 제공했지만 적어도 하나의 필수 매개 변수가 있고 다른 모든 인수 앞에 와야만 작동하는 것 같습니다.

firstArg를 필수로 설정하고 위치를 0으로 지정하여 이 동작을 시연할 수 있습니다.

#param test script
Param(
    [Parameter(Mandatory=$true, Position = 0)]
    $firstArg,
    $secondArg,
    [switch]$thirdArg,
    [Parameter(ValueFromRemainingArguments = $true)]
    $remainingArgs)

    write-host "first arg is $firstArg"
    write-host "second arg is $secondArg"
    write-host "third arg is $thirdArg"
    write-host "remaining: $remainingArgs"

이전과 동일한 입력으로 실행:

.\param-test.ps1 firstValue secondValue

출력은 다음과 같습니다.

first arg is firstValue
second arg is
third arg is False
remaining: secondValue

첫 번째, 필수 인수가 할당되고 남은 모든 것이 끝까지 적용됩니다.

문제는 다음과 같습니다.모든 매개 변수가 선택 사항이고 위치가 지정되지 않도록 매개 변수 목록을 설정하려면 어떻게 해야 합니까?

이건 어때?

function test
{
   param(
      [string] $One,

      [string] $Two,

      [Parameter(Mandatory = $true, Position = 0)]
      [string] $Three
   )

   "One = [$one]  Two = [$two]  Three = [$three]"
}

One그리고.Two는 선택 사항이며 이름으로만 지정할 수 있습니다.Three는 필수 항목이며 이름 없이 제공될 수 있습니다.

다음 작업:

test 'foo'
    One = []  Two = []  Three = [foo]
test -One 'foo' 'bar'
    One = [foo]  Two = []  Three = [bar]
test 'foo' -Two 'bar'
    One = []  Two = [bar]  Three = [foo]

실패합니다.

test 'foo' 'bar'
test : A positional parameter cannot be found that accepts argument 'bar'.
At line:1 char:1
+ test 'foo' 'bar'
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [test], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,test

이렇게 하면 필수 인수가 마지막에 배치되거나 이름이 지정되지 않습니다.하지만 그것은 당신이 원하는 기본적인 사용 패턴을 허용합니다.

또한 다음에서 둘 이상의 값을 허용하지 않습니다.$Three이것이 당신이 원하는 것일 수도 있습니다.그러나 이름이 지정되지 않은 여러 개의 매개 변수를 다음의 일부로 취급하려는 경우$Three그런 다음 추가합니다.ValueFromRemainingArguments기여하다.

function test
{
   param(
      [string] $One,

      [string] $Two,

      [Parameter(Mandatory = $true, Position = 0, ValueFromRemainingArguments = $true)]
      [string] $Three
   )

   "One = [$one]  Two = [$two]  Three = [$three]"
}

다음과 같은 작업이 있습니다.

test -one 'foo' 'bar' 'baz'
  One = [foo]  Two = []  Three = [bar baz]

아니 심지어

test 'foo' -one 'bar' 'baz'
    One = [bar]  Two = []  Three = [foo baz]

언급URL : https://stackoverflow.com/questions/12375919/powershell-non-positional-optional-params

반응형