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