Birden çok değeri tek bir PowerShell komut dosyası parametresine geçirme


99

$ Args cinsinden sunucu adlarını geçirdiğim bir komut dosyam var.

Bu şekilde, bu sunucuları kullanarak şu işlemleri yapabilirim foreach:

.\script.ps1 host1 host2 host3

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

Vlan adında bir adlandırılmış isteğe bağlı parametre eklemek istiyorum. Denedim:

Param(
    [string]$vlan
)

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

Bir -vlanparametreyi iletirseniz çalışır, ancak bunu yapmazsanız, komut dosyası otomatik olarak son sunucu adını atar $vlan.

Öyleyse, tek veya birden çok parametrenin yanı sıra isteğe bağlı bir adlandırılmış parametreyi bir PowerShell betiğine nasıl iletebilirsiniz?

İdeal olarak, işte geçerli örnekler:

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

Yanıtlar:


182

En kolay yol muhtemelen iki parametre kullanmaktır: Biri ana bilgisayarlar için (bir dizi olabilir) ve diğeri vlan için.

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

Onun yerine

foreach ($i in $args)

kullanabilirsiniz

foreach ($hostName in $Hosts)

Yalnızca bir ana bilgisayar varsa, foreach döngüsü yalnızca bir kez yinelenir. Betiğe birden çok ana bilgisayar iletmek için, onu bir dizi olarak iletin:

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

...Veya benzeri.


7
Senaryoyu nasıl arayacağıma dair bilgiyi eklediğiniz için teşekkürler - powershell'de sık sık böyle küçük parçaları kaçırıyorum.
Jan Bühler

23

Parametreler, argümanlardan önce girdi alır. Bunun yerine yapmanız gereken, bir diziyi kabul eden bir parametre eklemek ve onu ilk konum parametresi yapmaktır. ör:

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

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

O zaman şöyle deyin:

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

Değerler arasındaki virgüllere dikkat edin. Bu onları bir dizide toplar


20

Bunu yapmanın bir yolu şu şekilde olabilir:

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

Bu, birden çok ana bilgisayarın boşluklarla girilmesine izin verir.


Gerçekten hoş! Örneğinizde ikinci Parametre özelliğini kapatmak için bir "]" eksik olması dışında.
Sebastiaan M

1
Bu en iyi cevap olmalı.
Дмитро Іванов

Yol budur.
CrazyIvan1974

-6

Sunucu listesine şu şekilde bağlanması gereken planlanmış bir komut dosyasını çağırıyorum:

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

Sonra komut dosyasının içinde:

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

Bölme operatörü bir dize dizisi döndürür

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.