PowerShell'de komut satırı bağımsız değişkenlerini işleme


494

Komut satırı bağımsız değişkenlerini ele almanın "en iyi" yolu nedir?

Görünüşe göre "en iyi" yolun ne olduğuna dair çeşitli cevaplar var ve sonuç olarak bir şeyi nasıl basit bir şekilde ele alacağım konusunda sıkıştım:

script.ps1 /n name /d domain

VE

script.ps1 /d domain /n name.

Bunu daha iyi idare edebilecek bir eklenti var mı? Burada tekerleği yeniden icat ettiğimi biliyorum.

Açıkçası ben zaten hoş ve kesinlikle "en iyi" değil, ama işe yarıyor .. ve Çirkin.

for ( $i = 0; $i -lt $args.count; $i++ ) {
    if ($args[ $i ] -eq "/n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "/d"){ $strDomain=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-d"){ $strDomain=$args[ $i+1 ]}
}
Write-Host $strName
Write-Host $strDomain

Yanıtlar:


917

Tekerleği yeniden icat ediyorsunuz. Normal PowerShell komut parametreleri ile başlayan var -gibiscript.ps1 -server http://devserver

Sonra onları paramdosyanın başlangıcında ele alırsınız .

Ayrıca parametrelere varsayılan değerler atayabilir, yoksa konsoldan okuyabilir veya kod yürütmeyi durdurabilirsiniz:

 param (
    [string]$server = "http://defaultserver",
    [Parameter(Mandatory=$true)][string]$username,
    [string]$password = $( Read-Host "Input password, please" )
 )

Senaryo içinde basitçe

write-output $server

çünkü tüm parametreler kod kapsamında mevcut değişkenler haline gelir.

Bu örnekte, $serverkomut dosyası onsuz çağrılırsa varsayılan bir değer alır, -usernameparametreyi atlarsanız komut dosyası durur ve -passwordatlanırsa terminal girişi ister .

Güncelleme: PowerShell betiğine "bayrak" (boolean true / false parametresi) iletmek de isteyebilirsiniz. Örneğin, komut dosyanız, zorlama kullanılmadığında komut dosyasının daha dikkatli bir modda çalıştığı bir "zorlamayı" kabul edebilir.

Bunun için anahtar kelime [switch]parametre türüdür:

 param (
    [string]$server = "http://defaultserver",
    [string]$password = $( Read-Host "Input password, please" ),
    [switch]$force = $false
 )

Senaryo içinde sonra onunla böyle çalışacak:

if ($force) {
  //deletes a file or does something "bad"
}

Şimdi, komut dosyasını çağırırken switch / flag parametresini şu şekilde ayarlayabilirsiniz:

.\yourscript.ps1 -server "http://otherserver" -force

Bayrağın ayarlanmadığını açıkça belirtmek isterseniz, bunun için özel bir sözdizimi vardır.

.\yourscript.ps1 -server "http://otherserver" -force:$false

İlgili Microsoft belgelerine bağlantılar (PowerShell 5.0 için; sürüm 3.0 ve 4.0 da bağlantılarda mevcuttur):


58
Gerçekten de PowerShell'in en büyük avantajlarından biri, kullanımı kolay standart bir parametre ayrıştırma altyapısı sağlamasıdır.
Keith Hill

14
@naivists yerine PowerShell 2.0 den [string]$username = $(throw "-username is required.")zorunlu parametreler için sözdizimi vardır: [Parameter(Mandatory=$true)][string]$username. Bu teknikler arasındaki fark hakkında daha fazla bilgi: blogs.technet.com/b/heyscriptingguy/archive/2011/05/22/…
v.karbovnichy

7
Bir arg sağlanmadığında hataya karşı dikkatli olun; powershell, komut satırından fazladan metin alır:. \ yourscript.ps1 -server " serv " -parola "mypass" yazım hatası Bu, sihirli bir şekilde $ kullanıcı adına 'yazım hatası' atayacaktır.
sheamus

4
Bir param bloğu kullanmanın istenmeyen başka sonuçları da var gibi görünüyor: stackoverflow.com/questions/40940819/…
Logan

1
@ sheamus: bu bir hata değil! Powershell, uygun parametre adını kullanarak geçersiz kılınmadıkça, örneğin parametre bloğunuz şunları listeliyorsa: $ user $ pass $ server'ı çalıştırırsanız ve script.ps1 abc'nizi çalıştırırsanız, bağımsız değişkenleri verildikleri sırayla işler ve atar. $ kullanıcı, b $ pass ve c $ sunucu içine ayarlamak, özellikle onları atamakSİZ! Yani, şunu söylerseniz: yourscript.ps1 -pass abc, $ pass a değerine ayarlanır ve kalan (adsız) parametreler, parametre bloğunda listelenen sırayla eksik olanları doldurmak için kullanılır, böylece $ user = b, $ sunucu = c.
Fernando Madruga
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.