Meneruskan beberapa nilai ke satu parameter skrip PowerShell

96

Saya memiliki skrip yang saya berikan nama server di $ args.

Dengan cara ini saya dapat melakukan hal-hal ke server ini (ini) menggunakan foreach:

.\script.ps1 host1 host2 host3

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

Saya ingin menambahkan parameter opsional bernama vlan. Saya sudah mencoba:

Param(
    [string]$vlan
)

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

Ini berfungsi jika Anda mengirimkan -vlanparameter tetapi jika tidak, maka skrip secara otomatis menetapkan nama server terakhir ke $vlan.

Jadi, bagaimana Anda bisa melewatkan satu atau beberapa parameter ditambah parameter bernama opsional ke skrip PowerShell?

Idealnya, berikut adalah contoh yang valid:

.\script.ps1 host1
.\script.ps1 host1 host2 host3
.\script.ps1 host1 host2 -vlan office
jcarpio.dll
sumber

Jawaban:

178

Cara termudah mungkin adalah dengan menggunakan dua parameter: Satu untuk host (bisa berupa array), dan satu lagi untuk vlan.

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

Dari pada

foreach ($i in $args)

kamu bisa memakai

foreach ($hostName in $Hosts)

Jika hanya ada satu host, loop foreach hanya akan melakukan iterasi sekali. Untuk meneruskan beberapa host ke skrip, berikan sebagai array:

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

... atau yang serupa.

Bill_Stewart
sumber
7
terima kasih telah menyertakan info tentang cara memanggil skrip - Saya sering kehilangan bagian kecil seperti itu di PowerShell.
Jan Bühler
23

Parameter mengambil masukan sebelum argumen. Yang harus Anda lakukan adalah menambahkan parameter yang menerima array, dan menjadikannya parameter posisi pertama. ex:

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

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

Kemudian sebut saja seperti:

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

Perhatikan koma di antara nilai. Ini mengumpulkannya dalam sebuah array

Frode F.
sumber
19

Salah satu cara untuk melakukannya adalah seperti ini:

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

Ini akan memungkinkan beberapa host dimasukkan dengan spasi.

Nitz
sumber
Benar-benar bagus! Kecuali contoh Anda tidak memiliki ']' untuk menutup atribut Parameter kedua.
Sebastiaan M
Yang ini harus menjadi jawaban terbaik.
Дмитро Іванов
-6

Saya memanggil skrip terjadwal yang harus terhubung ke daftar Server dengan cara ini:

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

Kemudian di dalam skrip:

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

Operator terpisah mengembalikan larik string

BR1COP
sumber