Kaip tvarkyti komandinės eilutės argumentus programoje "PowerShell

Koks yra geriausias būdas tvarkyti komandinės eilutės argumentus?

Atrodo, kad yra keletas atsakymų, koks yra geriausias būdas, ir dėl to aš esu įstrigęs, kaip tvarkyti tokį paprastą dalyką kaip:

script.ps1 /n name /d domain

IR

script.ps1 /d domain /n name.

Ar yra koks nors įskiepis, kuris galėtų geriau tai tvarkyti? Žinau, kad čia išradinėju dviratį.

Akivaizdu, kad tai, ką aš jau turiu, nėra gražu ir tikrai nėra geriausia, bet tai veikia.. ir tai yra bjauru.

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
Sprendimas

Išradinėjate dviratį iš naujo. Įprastuose "PowerShell" scenarijuose parametrai prasideda -, pavyzdžiui, script.ps1 -server http://devserver.

Tada juos tvarkote param skirsnyje failo pradžioje.

Paramams taip pat galite priskirti numatytąsias reikšmes, perskaityti jas iš konsolės, jei jų nėra, arba sustabdyti scenarijaus vykdymą:

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

Skripto viduje galite tiesiog

write-output $server

nes visi parametrai tampa kintamaisiais, prieinamais scenarijaus srityje.

Šiame pavyzdyje $server įgyja numatytąją reikšmę, jei scenarijus iškviečiamas be jo, scenarijus sustoja, jei praleidžiamas parametras -username, ir prašo terminalo įvesties, jei praleidžiamas -password.

Atnaujinti: Taip pat galite perduoti "vėliavą" (loginį true/false parametrą) "PowerShell" scenarijui. Pavyzdžiui, jūsų scenarijus gali priimti "force", kai scenarijus veikia atsargesniu režimu, kai force nenaudojamas.

Tam naudojamas raktažodis [switch] parametro tipas:

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

Tada scenarijaus viduje su juo dirbsite taip:

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

Skambindami scenarijui, nustatysite jungiklio/žymos parametrą taip:

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

Jei norite aiškiai nurodyti, kad vėliavėlė nenustatyta, tam yra speciali sintaksė

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

Nuorodos į atitinkamą "Microsoft" dokumentaciją (skirta "PowerShell 5.0"; nuorodose taip pat pateikiamos 3.0 ir 4.0 versijos):

Komentarai (7)