Jak obsługiwać argumenty wiersza poleceń w PowerShell

Jaki jest "najlepszy" sposób obsługi argumentów wiersza poleceń?

Wygląda na to, że jest kilka odpowiedzi na to, jaki jest "najlepszy" sposób i w rezultacie utknąłem na tym, jak poradzić sobie z czymś tak prostym jak:

script.ps1 /n name /d domain

I

script.ps1 /d domain /n name.

Czy istnieje plugin, który poradzi sobie z tym lepiej? Wiem, że odkrywam tu koło na nowo.

Oczywiście to, co już mam, nie jest ładne i na pewno nie jest "najlepsze", ale działa.. i to jest brzydkie.

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
Author: Ryan Gates, 2010-01-28

1 answers

Odkrywasz koło na nowo. Standardowe skrypty PowerShell mają parametry zaczynające się od -, takie jak script.ps1 -server http://devserver

Następnie zajmujesz się nimi w sekcji param na początku pliku.

Możesz również przypisać domyślne wartości do swoich params, odczytać je z konsoli, jeśli nie są dostępne lub zatrzymać wykonywanie skryptu:

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

Wewnątrz skryptu możesz po prostu

write-output $server

Ponieważ wszystkie parametry stają się zmiennymi dostępnymi w Script scope.

W tym przykładzie, $server pobiera wartość domyślną, jeśli skrypt zostanie wywołany bez niego, skrypt zatrzyma się, jeśli pominiesz parametr -username i zapyta o wejście terminala, jeśli -password jest pominięte.

Update: Równie dobrze możesz przekazać" flagę " (boolowski parametr true/false) do skryptu PowerShell. Na przykład, twój skrypt może zaakceptować "siłę", gdzie skrypt działa w bardziej ostrożnym trybie, gdy siła nie jest używana.

Słowem kluczowym dla tego jest [switch] typ parametru:

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

Wewnątrz skryptu wtedy pracowałbyś z nim w ten sposób:

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

Teraz, gdy wywołujesz skrypt, ustawiasz parametr switch/flag w następujący sposób:

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

Jeśli chcesz wyraźnie stwierdzić, że flaga nie jest ustawiona, istnieje specjalna składnia

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

Linki do odpowiedniej dokumentacji Microsoft (dla PowerShell 5.0; wersje 3.0 i 4.0 są również dostępne na stronie linki):

 692
Author: naivists,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 18:37:13