PowerShell

Składnia języka

  • 2009-03-22 12:24
  • 7 komentarzy
  • 12041 odsłon
  • Oceń ten tekst jako pierwszy
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.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</h4>
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"

7 komentarzy

Coldpeer 2007-09-21 17:52

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

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

quetzalcoatl 2007-06-05 00:29

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

Marooned 2007-04-07 18:59

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

Ktos 2007-04-06 22:06

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ć? ;-)

Marooned 2007-04-06 17:48

Aplikacje .NET tylko za pierwszym razem startują wolno - gdy po raz pierwszy inicjalizuje się Framework.
PowerShell odpala się wolno zawsze. 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.

Ktos 2007-04-06 15:28

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

Marooned 2007-04-06 14:17

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.