Spis treści

     1 Składnia języka skryptowego w PowerShellu
          1.1 Komentarze
          1.2 Zmienne
               1.2.1 Przykład
               1.2.2 Deklarowanie zmienych
                    1.2.2.1 Przykłady
          1.3 Operatory
               1.3.1 Operatory arytmetyczne
               1.3.2 Operatory przypisania
               1.3.3 Operatory kwalifikowane
                    1.3.3.1 Przykład
               1.3.4 Operatory porównania
               1.3.5 Operatory logiczne
               1.3.6 Pozostałe operatory
          1.4 Instrukcje warunkowe
               1.4.1 If..Elseif..Else
               1.4.2 Switch
                    1.4.2.1 Przykład
                         1.4.2.1.1 Wynik
          1.5 Pętle
               1.5.1 For
                    1.5.1.1 Przykład
               1.5.2 While
                    1.5.2.1 Przykład
               1.5.3 Foreach
                    1.5.3.1 Przykład


Składnia języka skryptowego w PowerShellu

Język skryptowy, jaki jest używany w PowerShellu, oprócz samych komend, pozwala także na używanie typowych konstrukcji znanych z innych języków programowania, jak pętle, instrukcje warunkowe czy operatory.

Terminatorem instrukcji są średniki oraz znaki nowej linii.

Komentarze

Jedynym dostępnym typem komentarza jest komentarz liniowy (od znaku do końca linii) rozpoczynający się znakiem hash (#).
Write-Host "Hello world!" # Wypisywanie "Hello World"


Zmienne

Podobnie jak w przypadku całej platformy .NET, wszystkie zmienne w PowerShellu są typu obiektowego. Język umożliwia też dostęp, za pomocą jednakowej składni, do obiektów nie tylko .NET, ale także COM/COM+ czy WMI.

Wszystkie zmienne PowerShella są obiektami, a do nich odwołujemy się zwykle stosując znak dolara ($) przed nazwą.

Przykład

$g = Get-WmiObject Win32_Process
$g[0].Name


Deklarowanie zmienych

$[zakres:]nazwa
${dowolna nazwa}
${dowolna ścieżka}

Przykłady

$a = 1


${!@#$%^&*()}=3 # tutaj można stosować dowolne nazwy


$global:a = 1  # Widoczne wszędzie (zmienna globalna)


$local:a = 1     # Widoczne tylko w tym zakresie i potomnych


$private:a=1    # Jak wyżej, ale niewidoczne w zakresach potomnych


$script:a=1     # Widoczne wewnątrz całego skryptu


Write-Host $env:Path # Wyświetla zmienną środowiskową PATH


${C:\TEMP\testfile.txt}="To się zapisze do pliku"


Get-Variable –scope 1 a  # Pobranie wartości z zakresu rodzica


Get-Variable –scope 2 a  # j/w, ale dziadka

Operatory

Operatory arytmetyczne

* + (dodawanie lub konkatenacja stringów)
  • - (odejmowanie)
  • * (mnożenie lub powtarzanie stringów)
  • / (dzielenie)
  • % (reszta z dzielenia całkowitego)


Operatory przypisania

W stylu języka C, można wykonać przypisanie i inną operację za pomocą jednej instrukcji.
  • =
  • +=
  • -=
  • *=
  • /=
  • %=


Operatory kwalifikowane

Operatorem kwalifikowanym (dostępu do pola lub metody obiektu) jest kropka (.), a do statycznej metody lub pola podwójny dwukropek (::).

Przykład

$a = Get-Date
$a.Date


[DateTime]::Now


Operatory porównania

Dostępne są w instrukcjach warunkowych.

  • -eq (równy)
  • -ne (różny)
  • -gt –ge (większy, większy lub równy)
  • -lt –le (mniejszy, mniejszy lub równy)


“i” lub “c” mogą zostać dodane by uzyskać operatory wrażliwe (case-sensitive) lub nie (case-insensitive) na wielkość znaków (na przykład, –ceq).

Operatory logiczne

* !, -not (nieprawda)
  • -and (i)
  • -or (lub)


Pozostałe operatory

* , (konstruktor tablic)
  • .. (operator zakresu)
  • -contains (operator zawierania w tablicy)
  • -is (operator sprawdzenia typu)
  • -as (operator konwersji typu)
  • -band (binarne AND)
  • -bor (binarne OR)
  • -bnot (binarne NOT)
  • & (operator odwołania do bloku kodu)


Instrukcje warunkowe

If..Elseif..Else

if (warunek) {…} # jeśli
elseif (warunek) {…} # w przeciwnym wypadku i jeżeli
else {…} # w przeciwnym wypadku


Przy użyciu linii komend, nawias zamykający musi być na tej samej linii co elseif i else. Ta restrykcja nie dotyczy skryptów.

Switch

switch ([zmienna])
{
[warunek] { [polecenia] }
default { [polecenia dla sytuacji domyślnej (żaden inny warunek nie jest spełniony] }
}


Zmienna $_ dostępna w skrypcie reprezentuje aktualnie testowaną wartość - jeżeli jest używana tablica, każdy element jej jest poddawany przyrównywaniu.

Przykład

$var = "word1","word2","word3"
switch -regex ($var) {
    "word1"  { "Multi-match Exact " + $_ }
    "word2"  { "Multi-match Exact " + $_ }
    "w.*2"   { "Pattern match Exact " + $_ }
    default  { "Multi-match Default " + $_ }
}


Wynik
Multi-match Exact word1
Multi-match Exact word2
Pattern match Exact word2
Multi-match Default word3


Pętle

For

Pętla For ma składnię w stylu znanym z języków rodziny C (C/C++, Java, C#, PHP)
[:etykieta] for ([inicjalizacja]; [warunek]; [iteracja]) {…}


Przykład

for ($i = 0; $i < 10; $i++) { $i; }


While

[:etykieta] while ([warunek]) {…}

do {…} while ([warunek])


Przerwać pętlę można za pomocą instrukcji break, a przejść do następnej iteracji za pomocą instrukcji continue.

Przykład

$i = 0;
while (1)
{
    $i++;
    $i;
    if ($i -eq 10)
    {
        break;
    }
}


Foreach

Pętla Foreach służy do iteracji po wszystkich elementach danej kolekcji.

[:etykieta] foreach ([obiekt] in [kolekcja]) {…}

Wyrażenie | foreach {…}


Przykład

$i = 1,2,3
foreach ($z in $i) {Write-Host $z}


$x = 1; Get-Process | foreach {$x++}; "$x procesy są w systemie"

Kategoria: PowerShell

7 komentarzy

Avatar: Coldpeer
Napisany 2007-09-21 17:52 przez Coldpeer

<quote>Write-Host "Hello world!" # Wypisywanie "Witaj świecie" </quote>

No raczej wyświetli "Hello world!" ;)

Avatar: quetzalcoatl
Napisany 2007-06-05 00:29 przez quetzalcoatl

pochwili grzebania w rejestrze (albo w c:\win\system32 :) ) mozna zmienic domyslna konsole na inny program.. ale nie wiem czy warto.. ja sie przyzwyczailem do cygwina i basha

Avatar: Marooned
Napisany 2007-04-07 18:59 przez Marooned

Snifest? ^_^ Ten to prosty, a co z nieregularnymi nazwami? Np. taki boli blog ;-)

Avatar: Ktos
Napisany 2007-04-06 22:06 przez Ktos

Odnośnie PPS: posiłkuję się podręcznikami i dokumentacją PowerShella - już znalazłem w niej inny błąd (komenda Write-Object została usunięta z którejś bety), więc może i ten tekst to jakaś pozostałość po poprzednich wersjach.

A skrypt pokazujący jakieś użyteczne właściwości... Ściąganie wszystkich odcinków pewnego komiksu internetowego może być? ;-)

Avatar: Marooned
Napisany 2007-04-06 17:48 przez Marooned

Aplikacje .NET tylko za pierwszym razem startują wolno - gdy po raz pierwszy inicjalizuje się Framework.
PowerShell odpala się wolno <b>zawsze</b>. No cóż, taka widać jego uroda.

Czekam na przykład skryptu, który rzeczywiście pokaże ciekawe możliwości PS - użyteczne, a nie tylko jako ciekawostkę :)

PS
Skoro:
${!@#$%^&*()}=3 # tutaj można stosować dowolne nazwy
to skąd on wie, kiedy {..} to nazwa zmiennej, a kiedy to nazwa pliku?
${C:\TEMP\testfile.txt}="To się zapisze do pliku"

kontrowersyjny zapis

PPS
<quote>Przy użyciu linii komend, nawias zamykający musi być na tej samej linii co elseif i else.</quote>Mi działa jeśli napiszę "else {" [enter] i dalszą część w nowej linii.

Avatar: Ktos
Napisany 2007-04-06 15:28 przez Ktos

On jest powoolny na starcie. Jak każda aplikacja .NET ;)
A skrypty ja odpalam uruchamiając PS i wpisując ścieżkę do skryptu po prostu. Skrótów nigdy nie robiłem, ale można po prostu powershell.exe skrypt_jakis.ps i powinno śmigać, nie?

I ja się uczę z przykładów głównie, bo to co sam robię, to działa, ale na pewno dało by się zrobić łatwiej i prościej - trzeba wiedzieć jak ;)

Avatar: Marooned
Napisany 2007-04-06 14:17 przez Marooned

Czytam, czytam.. bo na podstawie przykładów coś mi nie wyszło by zrobić coś działającego :|

Czy tylko mi PowerShell się łaaaaaaaduje na starcie? I w sumie jak odpalać skrypty, kiedy domyślna powłoka to stary cmd? W sensie.. że sobie np. skrót zrobię do skryptu.

4programmers.net