1. Parametry v Powershell skriptech

    Article: AN0002411Updated: 01.05.2020

    V tomto článku si ukážeme, jak předávat parametry do Powershell skriptů s důrazem na rozdíly běžného spouštění Powershell skriptu z příkazové řádky a spouštění příkazů přes program Piklo. Rozvádíme zde pravidla popsaná v dokumentaci programu Piklo.

    Nejprve si ukážeme příklad běžného skriptu Powershell.

    Volání Powershell skriptu z příkazové řádky

    V našem prvním příkladu si vytvoříme soubor se skriptem Powershell, který nazveme například _Test_param.ps1. Vidíme, že skript v části definice proměnných přebírá dva argumenty, s nimiž bude skript volán. Další proměnná skládá výslednou hodnotu z prvních dvou proměnných a poslední dvě definují napevno text a kódování.

    # --- Variables
    [string]$Root = $args[0]
    [string]$OutputName = $args[1]
    [string]$OutputFile = "$($Root)\$($OutputName)"
    [string]$FileContent = "Text to be included in the file"
    [string]$Encoding = "UTF8"
    # #########################################################################################################
    # ---------------------------------------------------------------------------------------------------------
    $FileContent | Out-File -filepath $OutPutFile -Encoding $Encoding -append -ErrorAction SilentlyContinue
    exit

    Pokud náš soubor se skriptem _Test_param.ps1 umístíme do adresáře C:\PS\, zavoláme ho z příkazové řádky například takto:

    "C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe" "-File" "C:\PS\_Test_param1.ps1" "C:\PS" "OutputName.txt"

    Skript provede jednu věc: vytvoří textový soubor obsahující text "Text to be included in the file" v adresáři dle prvního parametru ("C:\PS") a s názvem dle druhého parametru ("OutputName.txt").

    Poznámka: V některých případech výše uvedený příkaz nemusí fungovat - záleží na operačním systému a patchích. V takovém případě zkuste některý z níže uvedených způsobů spuštění.

    V příkazovém řádku CMD:

    "powershell.exe" "-File" "C:\PS\_Test_param1.ps1" "C:\PS" "OutputName.txt"

    V Powershell konzoli:

    & "powershell.exe" "-File" "C:\PS\_Test_param1.ps1" "C:\PS" "OutputName.txt"

    nebo

    "powershell.exe" "-File" "C:\PS\_Test_param1.ps1" "C:\PS" "OutputName.txt"

    nebo

    C:\...\powershell.exe "-File" "C:\PS\_Test_param1.ps1" "C:\PS" "OutputName.txt"

     

    Ošetření chybových stavů

    Ve skriptu bychom měli ošetřit chybové stavy, kdy skriptu nejsou předány dané parametry nebo jsou chybné (např. do daného adresáře není možné přistoupit nebo neexistuje). Ve skriptu nám přibyly dvě podmínky (zvýrazněny tučně modře), které v případě, že budou dodány méně než dva argumenty nebo že adresářová cesta definovaná prvním argumentem není dostupná, vypíšou chybovou hlášku do konzole příkazového řádku a skript ukončí.

    # --- Variables
    [string]$Root = $args[0]
    [string]$OutputName = $args[1]
    [string]$OutputFile = "$($Root)\$($OutputName)"
    [string]$FileContent = "Text to be included in the file"
    [string]$Encoding = "UTF8"
    # #########################################################################################################
    # ---------------------------------------------------------------------------------------------------------
    IF ( $args.Count -lt 2 ) {
    "Error: Parameters were not provided!" | Write-Host -ForegroundColor Red
    exit
    }

    IF ( ! (Test-Path $Root) ) {
    "Error: Path '$($Root)' does not exist!" | Write-Host -ForegroundColor Red
    exit
    }


    $FileContent | Out-File -filepath $OutPutFile -Encoding $Encoding -append -ErrorAction SilentlyContinue

    exit

    Skript spouštíme stejně jako v předešlém příkladě. V případě nedodání všech argumentů nebo nedostupné adresářové cesty příkazová řádka vrátí příslušná chybová hlášení.

    Spouštění skriptu z ObjectGears

    Nyní si ukážeme rozdíly při spouštění skriptu z ObjectGears.

    Proces spouštíme např. z kroku jobu nebo jiné aktivity, kterou vykonává winservice. V případě spuštění například z tlačítka nebo pravidla třídy, kdy daný skript vykonává web server, by došlo k recyklaci požadavku MS IIS.

    V níže uvedeném příkladě si všimneme následujících věcí:

    1. Spouštěný skript nedefinujeme kompletním názvem souboru včetně cesty k němu, ale pouze názvem souboru (bez přípony). Soubor se hledá v podadresáři Scripts adresáře definovaného v elementu PikloDir (viz web.config a winservice.config).
    2. Adresář pro výstupní soubor má zdvojená lomítka (řídící znak v JavaScriptu).
    3. Výstupní soubor je ve složce, do níž má winservice účet přístup. Do adresáře C:\PS z výše uvedeného příkladu pravděpodobně tento účet nebude mít přístup.
    4. Výsledek volání programu Piklo uložíme do proměnné a tu zapíšeme do logu. Pomůže nám to při řešení eventuelních chyb.

    var a = OG.Process.RunPiklo('_Test_param1','-type C C:\\OG_intance1\\Piklo OutputName.txt');
    OG.Log.Write(a);

    Hlavní změna oproti předchozím příkladům spouštění Powershell souborů přes příkazovou řádku je ve zpracování parametrů, s nimiž je skript _Test_param1 spouštěn. Ve výše uvedeném příkladě definujeme typ spouštění -type C a pak dva parametry oddělené mezerou. Vše se předává v jednom textovém řetězci. Parametry C:\\OG_intance1\\Piklo a OutputFileName.txt už nebudou dostupné ve skriptu jako $args[0] a $args[1], ale jako proměnné $ScriptPar1 a $ScriptPar2. Skript tedy musíme upravit:

    # --- Variables
    [string]$Root = $args[0]
    [string]$OutputName = $args[1]
    [string]$OutputFile = "$($Root)\$($OutputName)"
    [string]$FileContent = "Text to be included in the file"
    [string]$Encoding = "UTF8"
    # #########################################################################################################
    # ---------------------------------------------------------------------------------------------------------
    IF ( $args.Count -lt 2 ) {
    #"Error: Parameters were not provided!" | Write-Host -ForegroundColor Red
    $Root = $ScriptPar1
    $OutputName = $ScriptPar2
    $OutputFile = "$($Root)\$($OutputName)"

    }

    IF ( ! (Test-Path $Root) ) {
    #"Error: Path '$($Root)' does not exist!" | Write-Host -ForegroundColor Red
    exit
    }


    $FileContent | Out-File -filepath $OutPutFile -Encoding $Encoding -append -ErrorAction SilentlyContinue

    exit

    Všiměte si, že ve skriptu nejsou nikde definované proměnné $ScriptPar1 a $ScriptPar2, ale přesto jejich hodnotu přiřazujeme do proměnných $Root a $OutputFileName. Je to dáno tím, že ObjectGears nespouští daný skript, jako tomu bylo v předešlém případě, ale nejprve do skriptu vkládá parametry s hodnotami, s nimiž byla funkce volána. V případě, že tedy $args neobsahuje žádné hodnoty, skript neukončujeme, ale přiřazujeme hodnoty z proměnných $ScriptPar1, $ScriptPar2 atd.

    Můžete si představit, že výše uvedený skript má při spouštění na svém začátku (ještě před blokem # --- Variables) toto:

    [string]$ScriptPar1 = "C:\OG_intance1\Piklo"
    [string]$ScriptPar2 = "OutputFileName.txt"

    Dále jsme ve skriptu zakomentovali příkazy vypisující hlášení do konzole příkazového řádku, protože při spouštění winservicou není tento kontext k dispozici.

    Parametry z konfiguračních souborů

    Parametry je někdy vhodnější předávat pomocí konfiguračních souborů. Platí to například v případech, když je parametrů hodně nebo když jsou sdíleny více skripty. V rámci skriptu si takovéto vlastní soubory můžete načítat. Program Piklo vám navíc nabízí dvě úrovně konfiguračních souborů, které můžete využít a jejichž proměnné budete mít ve skriptu k dispozici stejně jako parametry $ScriptPar1, $ScriptPar2 ...

    Soubor s parametry společnými pro všechny skripty

    Prvním je soubor og_configuration.ps1, který se nachází v adresáři programu Piklo (element PikloDir ve web.config a winservice.config). V tomto adresáři je vhodné definovat globální parametry, které budeme chtít použít ve všech skriptech. Dobrým příkladem je adresa webové služby instance ObjectGears nebo výchozí kódování pro všechny výstupní soubory.

    [string]$Webservice = "http://vasweb/OGService.asmx"
    [string]$Encoding = "UTF8"

    Web service můžete chtít používat pro vyčítání dat z ObjectGears za běhu skriptu. Například, pokud budete chtít pomocí skriptu restartovat servery patřící do určité skupiny, zjistíte si jejich seznam z konfigurační databáze ObjectGears. Pokud budete instanci ObjectGears migrovat na jiný server, novou adresu web service pak změníte na jednom místě a všechny skripty budou okamžitě pracovat s novou adresou.

    Soubor s parametry specifickými pro konkrétní skript

    Dále pro každý skript máte k dispozici konfigurační soubor (v našem případě by se jmenoval _Test_param.config), v němž uvedete parametry specifické pro daný skript a můžete zkorigovat hodnotu z globálního souboru viz výše. Např.

    [string]$CsvDelimiter = ";"
    [string]$Encoding = "ASCII"

    Dejme tomu, že máme vyplněné konfigurační soubory dle těchto příkladů a spouštíme výše uvedený skript pomocí příkazu:

    var a = OG.Process.RunPiklo('_Test_param1','-type C C:\\OG_intance1\\Piklo OutputName.txt');
    OG.Log.Write(a);

    Spustí se následující výsledný skript (změny vyznačeny tučně modře). Všimněte si, že se ve skriptu postupně objevuje trojí přiřazení hodnoty do proměnné $Encoding. První pochází ze společného soubor og_configuration.ps1, druhé z konfiguračního souboru _Test_param.config a ke třetímu dochází přímo ve vlastní skriptu _Test_param.ps1. Reálně se použije ta třetí definice. Znamená to, že při shodě názvů parametrů (proměnných) má přednost parametr z konfiguračního souboru pro daný skript před parametrem ze společného konfiguračního souboru a proměnná definovaná přímo ve skriptu před parametry z konfiguračních souborů.

    [string]$Webservice = "http://vasweb/OGService.asmx"
    [string]$Encoding = "UTF8"
    [string]$ScriptPar1 = "C:\OG_intance1\Piklo"
    [string]$ScriptPar2 = "OutputFileName.txt"
    [string]$CsvDelimiter = ";"
    [string]$Encoding = "ASCII"

    # --- Variables
    [string]$Root = $args[0]
    [string]$OutputName = $args[1]
    [string]$OutputFile = "$($Root)\$($OutputName)"
    [string]$FileContent = "Text to be included in the file"
    [string]$Encoding = "UTF8"
    # #########################################################################################################
    # ---------------------------------------------------------------------------------------------------------
    IF ( $args.Count -lt 2 ) {
    #"Error: Parameters were not provided!" | Write-Host -ForegroundColor Red
    $Root = $ScriptPar1
    $OutputName = $ScriptPar2
    $OutputFile = "$($Root)\$($OutputName)"
    }

    IF ( ! (Test-Path $Root) ) {
    #"Error: Path '$($Root)' does not exist!" | Write-Host -ForegroundColor Red
    exit
    }

    $FileContent | Out-File -filepath $OutPutFile -Encoding $Encoding -append -ErrorAction SilentlyContinue

    exit

    Na parametrech ve společném konfiguračním souboru a jejich názvech je třeba se v rámci organizace domluvit.

    Mějte na paměti, že každý skript může být spuštěn s různými parametry prostřednictvím volby konfiguračního souboru při spuštění skriptu (viz parametr -config). V takovém případě se do skriptu přidají parametry z tohoto určeného souboru místo ze souboru _Test_param.ps1.

×