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
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):