단일 PowerShell 스크립트 매개 변수에 여러 값 전달


96

$ args에 서버 이름을 전달하는 스크립트가 있습니다.

이렇게하면 다음을 사용하여이 서버에 작업을 수행 할 수 있습니다 foreach.

.\script.ps1 host1 host2 host3

foreach ($i in $args)
{
    Do-Stuff $i
}

vlan이라는 명명 된 선택적 매개 변수를 추가하고 싶습니다. 난 노력 했어:

Param(
    [string]$vlan
)

foreach ($i in $args)
{
    Write-Host $i
}
Write-Host $vlan

-vlan매개 변수 를 전달하면 작동 하지만 그렇지 않으면 스크립트가 마지막 서버 이름을에 자동으로 할당합니다 $vlan.

그렇다면 단일 또는 여러 매개 변수와 선택적 명명 된 매개 변수를 PowerShell 스크립트에 어떻게 전달할 수 있습니까?

이상적인 예는 다음과 같습니다.

.\script.ps1 host1
.\script.ps1 host1 host2 host3
.\script.ps1 host1 host2 -vlan office

답변:


178

가장 쉬운 방법은 두 개의 매개 변수를 사용하는 것입니다. 하나는 호스트 용 (어레이 일 수 있음)이고 다른 하나는 VLAN 용입니다.

param([String[]] $Hosts, [String] $VLAN)

대신에

foreach ($i in $args)

당신이 사용할 수있는

foreach ($hostName in $Hosts)

호스트가 하나만있는 경우 foreach 루프는 한 번만 반복됩니다. 여러 호스트를 스크립트에 전달하려면 배열로 전달합니다.

myScript.ps1 -Hosts host1,host2,host3 -VLAN 2

... 또는 비슷한 것.


7
스크립트를 호출하는 방법에 대한 정보를 포함 해 주셔서 감사합니다. powershell에서 이와 같은 작은 부분이 누락되는 경우가 많습니다.
Jan Bühler

23

매개 변수는 인수보다 먼저 입력을받습니다. 대신해야 할 일은 배열을 받아들이는 매개 변수를 추가하고이를 첫 번째 위치 매개 변수로 만드는 것입니다. 전의:

param(
    [Parameter(Position = 0)]
    [string[]]$Hosts,
    [string]$VLAN
    )

foreach ($i in $Hosts)  
{ 
    Do-Stuff $i
}

그런 다음 다음과 같이 호출하십시오.

.\script.ps1 host1, host2, host3 -VLAN 2

값 사이의 쉼표를 확인하십시오. 이것은 그들을 배열로 수집합니다.


19

이를 수행하는 한 가지 방법은 다음과 같습니다.

 param(
       [Parameter(Position=0)][String]$Vlan,
       [Parameter(ValueFromRemainingArguments=$true)][String[]]$Hosts
    ) ...

이렇게하면 여러 호스트를 공백으로 입력 할 수 있습니다.


정말 좋아요! 예를 제외하고는 두 번째 매개 변수 속성을 닫는 ']'가 누락되었습니다.
Sebastiaan M

이것이 최선의 답이 될 것입니다.
Дмитро Іванов

-6

다음과 같이 서버 목록에 연결해야하는 예약 된 스크립트를 호출합니다.

Powershell.exe -File "YourScriptPath" "Par1,Par2,Par3"

그런 다음 스크립트 내부 :

param($list_of_servers)
...
Connect-Viserver $list_of_servers.split(",")

분할 연산자는 문자열 배열을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.