Wat is de “beste” manier om opdrachtregelargumenten af te handelen?
Het lijkt erop dat er verschillende antwoorden zijn over wat de “beste” manier is en als gevolg daarvan zit ik vast met iets simpels als:
script.ps1 /n name /d domain
EN
script.ps1 /d domain /n name.
Is er een plug-in die dit beter aankan? Ik weet dat ik hier het wiel opnieuw aan het uitvinden ben.
Het is duidelijk dat wat ik al heb niet mooi is en zeker niet de “beste”, maar het werkt… en het is LELIJK.
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
Antwoord 1, autoriteit 100%
Je bent het wiel opnieuw aan het uitvinden. Normale PowerShell-scripts hebben parameters die beginnen met -
, zoals script.ps1 -server http://devserver
Vervolgens behandel je ze in de sectie param
aan het begin van het bestand.
Je kunt ook standaardwaarden toewijzen aan je parameters, ze lezen vanaf de console als ze niet beschikbaar zijn of de uitvoering van het script stoppen:
param (
[string]$server = "http://defaultserver",
[Parameter(Mandatory=$true)][string]$username,
[string]$password = $( Read-Host "Input password, please" )
)
Binnen het script kun je eenvoudig
write-output $server
Omdat alle parameters variabelen worden verkrijgbaar in scriptscope.
In dit voorbeeld krijgt de $server
een standaardwaarde als het script zonder IT wordt genoemd, script stopt als u de -username
-parameter weglaat en vraagt om terminalinvoer Als -password
is weggelaten.
Update:
Misschien wilt u ook een “vlag” (een Boolean True / False Parameter) doorgegeven aan een PowerShell-script. Uw script kan bijvoorbeeld een “FORCE” accepteren waar het script wordt uitgevoerd in een zorgvuldige modus wanneer force niet wordt gebruikt.
Het trefwoord hiervoor is [switch]
Parameter Type:
param (
[string]$server = "http://defaultserver",
[string]$password = $( Read-Host "Input password, please" ),
[switch]$force = $false
)
Binnen het script, dan zou je ermee werken als volgt:
if ($force) {
//deletes a file or does something "bad"
}
Nu, bij het bellen van het script instellen u de schakelaar / vlagparameter zoals deze:
.\yourscript.ps1 -server "http://otherserver" -force
Als u expliciet wilt vermelden dat de vlag niet is ingesteld, is er een speciale syntaxis voor die
.\yourscript.ps1 -server "http://otherserver" -force:$false
Links naar relevante Microsoft-documentatie (voor PowerShell 5.0; Tho-versies 3.0 en 4.0 zijn ook verkrijgbaar op de links):