Logikai operátorok segítségével (-and , -or , -xor ) össze tudunk fűzni több logikai kifejezést, és a szokásos „igazság táblák” alapján kapjuk meg az összetett kifejezésünk igaz vagy hamis értékét:
[24] PS I:\>$false -eq $false -and $true -eq $true
True
[25] PS I:\>"ablak" -ne "ajtó" -or 5 -eq 6
True
[26] PS I:\>1 -eq 1 -xor 2 -gt 1
False
[27] PS I:\>-not $true
False
[28] PS C:\> !$true
False
A [28]-ban látható, hogy az egytagú –not operátor negálja az eredményt. A –not helyett használhatjuk a ! (felkiáltójel) jelölést is.
Kényelmi szolgáltatásként nem kell $true vagy $false -ra redukálni a logikai operátorok operandusait, a triviális leképezéseket elvégzi helyettünk a PowerShell. Általában minden 0-tól, $null -tól, vagy üres kifejezéstől eltérő értékeket $true-nak kezel:
[29] PS I:\>7 -and $true
True
[30] PS I:\>"valami" -and $true
True
[31] PS I:\>$null -and $true
False
[32] PS I:\>"" -and $true
False
[33] PS I:\>0 -and $true
False
Megjegyzés
Az –and, -or használatakor vigyázni kell, mert nem értékelődik ki a jobboldaluk, ha már a baloldal alapján el tudja dönteni a végeredményt:
[35] PS I:\>$false -and ($a=25)
False
[36] PS I:\>$a
[37] PS I:\>($a=25) -and $false
False
[38] PS I:\>$a
25
[39] PS I:\>$true -or ($b="valami")
True
[40] PS I:\>$b
[41] PS I:\>($b="valami") -or $true
True
[42] PS I:\>$b
valami
Tehát nem érdemes egyéb műveleteket végeztetni a logikai operátorok operandusaiban, mert ha nem kellő figyelemmel választjuk ki az oldalakat, akkor esetleg nem úgy működik a programunk, ahogy vártuk.
A fenti logikai operátorok tehát vagy $false, vagy $true értéket adnak vissza. Ha „igazi” bit szintű logikai műveleteket akarunk elvégezni, akkor ehhez külön logikai operátorok vannak: ‑band , -bor , -bxor , -bnot :
[44] PS I:\>126 -bor 1
127
[45] PS I:\>(128+8+4+1) -bor 132
141
[46] PS I:\>(128+8+4+1) -band (128+16+8)
136
[47] PS I:\>(128+8+4+1) -bxor (128+16+8)
21
[48] PS I:\>-bnot 255
-256
[49] PS I:\>-bnot 1
-2
Itt természetesen mindig kiértékelődik a művelet mindkét oldala.
A PowerShell 3.0-ban jelent meg a bitek eltolásának lehetősége a –shl és a –shr operátorokkal. Nem mintha nagy igényem lett volna erre a funkcióra az elmúlt 7 évben, de elképzelhető, hogy valakinek ez jól jön. Nézzünk erre pár példát! Ugye itt mindent a 2-es számrendszerben érdemes elképzelni, ekkor, ha a 8-as helyiértéken levő bitet balra tolom, akkor 16 lesz az eredmény:
PS C:\> 8 -shl 1
16
Ugyanezt jobbra tolva 4 lesz:
PS C:\> 8 -shr 1
4
Természetesen több helyiértékkel is tologathatom a biteket. Ha egy 32 biten ábrázolt számot pont 32 hellyel toljuk balra, akkor valójában nem csinálunk semmit:
PS C:\> 1 -shl 32
1
Azaz, ha a jobb oldali szám nagyobb, mint 31, akkor a 32 osztás maradékával lesz eltolva a bal oldali szám. Ugyanezt 64 bites számoknál 64-es tolásra érjük el:
PS C:\> [long] 1 -shl 32
4294967296
PS C:\> [long] 1 -shl 64
1
Ha elég nagy számot tolunk el balra, akkor belecsúszhatunk az előjel bitbe, ami a számot negatívvá teszi:
PS C:\> 1 -shl 30
1073741824
PS C:\> 1073741824 -shl 1
-2147483648
Jobbra tolásnál a kifutó bitek elvesznek, így ha elég sokat tolunk jobbra akkor előbb-utóbb 0-át kapunk.
PS C:\> 1024 -shr 18
0