Składnia języka

Ktos

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.3 Operatory arytmetyczne
          1.3.4 Operatory przypisania
          1.3.5 Operatory kwalifikowane
               1.3.5.2 Przykład
          1.3.6 Operatory porównania
          1.3.7 Operatory logiczne
          1.3.8 Pozostałe operatory
     1.4 Instrukcje warunkowe
          1.4.9 If..Elseif..Else
          1.4.10 Switch
               1.4.10.3 Przykład
     1.5 Pętle
          1.5.11 For
               1.5.11.4 Przykład
          1.5.12 While
               1.5.12.5 Przykład
          1.5.13 Foreach
               1.5.13.6 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) ```posh [:etykieta] for ([inicjalizacja]; [warunek]; [iteracja]) {…} ```

Przykład

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

While

```posh [:etykieta] while ([warunek]) {…} ``` ```posh do {…} while ([warunek]) ``` Przerwać pętlę można za pomocą instrukcji break, a przejść do następnej iteracji za pomocą instrukcji continue.

Przykład

```posh $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. ```posh [:etykieta] foreach ([obiekt] in [kolekcja]) {…} ``` ```posh Wyrażenie | foreach {…} ```

Przykład

```posh $i = 1,2,3 foreach ($z in $i) {Write-Host $z} ``` ```posh $x = 1; Get-Process | foreach {$x++}; "$x procesy są w systemie" ```

7 komentarzy

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

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

Write-Host "Hello world!" # Wypisywanie "Witaj świecie"

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

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

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

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

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

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.