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.