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

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.


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


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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.