Hoe om te gaan met opdrachtregelargumenten in PowerShell

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 paramaan 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 $servereen standaardwaarde als het script zonder IT wordt genoemd, script stopt als u de -username-parameter weglaat en vraagt ​​om terminalinvoer Als -passwordis 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):

Other episodes