PowerShell - 運算子

又到了PowerShell的專屬章節了,這次限量要來簡單的講解PowerShell的運算子(Operator),運算子是所有學數學邏輯都要用到的關鍵元素,許多人常常會把運算子(Operator)與運算元(Operand)搞混,因為中文翻譯得很像且連英文名稱都很像,這邊再簡單澄清一下運算元與運算子的定義。假設一個運算式1 + 2 * 3,則+和*就是運算子,也就是把運算元拿來彼此之間做運算;1, 2, 3就是運算元,每個運算元各自代表一個值。


但這篇不是要來解釋運算子和運算元的關係,PowerShell也算是一種程式語言,也少不了有邏輯數值運算,所以一定有運算子。如同一般程式語言一樣,PowerShell有算術運算子, 邏輯運算子...等,算術運算子就是+-*/%運算,這些基本運算限量就BJ4(不解釋)了,重點是要放在邏輯運算子與其他運算子上,因為PowerShell在這些運算子的表達方式上有點不同。

比較運算子

比較運算子就是>, <, =...等,通常用於If...Else判斷式中來決定不同流程的走向,下表為PowerShell與C#比較運算子的表達方式:


運算子
C#
PowerShell
等於
==
-eq
不等於
!=
-ne
大於等於
>=
-ge
大於
>
-gt
小於
<
-lt
小於等於
<=
-le
相似

-like
不相似

-notlike
包含
a.Contain(b)
-contains
不包含
!a.Contain(b)
-notcontains
符合

-match
不相符

-notmatch

其中要特別講解like, match,因為C#沒有提供相關類似操作,like就像SQL語法的LIKE語法一樣,須給定一個範圍,接著再去判斷字串是否符合範圍。
範例:


$source = "Hello World"
If($source -like "*el*") {
    echo "True"
} Else {
    echo "False"
}

上述範例的結果會印出True,因為Hello World字串裡包含了el字串,所以符合條件。


like為一種Wildcard Search,在上面範例中,搜尋的Pattern為*el*,這代表在判斷搜尋時,不管字串裡的el指定字串前後是否有其他字元,皆符合條件;如果搜尋的Pattern為*el,則代表字尾為el的字串才符合;反之,Pattern為el*,代表字首為el的字串才符合。

match在當有提供正規表示式(Regular Expression)的情況下使用,用來判斷字串是否符合正規表示式的規則。
範例:


$source = "Hello World"
If($source -match "^A") {
    echo "True"
} Else {
    echo "False"
}

上述範例的結果會印出False,因為限量在這指定的正規表示式的規則為字串開頭要以A為開頭,Hello World不符合條件。

替代運算子

替代運算子-replace是字串用來替代掉某些字元的運算子,相對於C#的String型別所提供的Replace方法,使用規則如下:

$承接變數 = "<來源字串>" -replace "欲替代字串", "替代字串"

範例:
PowerShell =>

$source = "Hello World"
$str = $source -replace "World", "PowerShell"
echo $str

C# =>

var source = "Hello World";
var str = source.Replace("World", "PowerShell");
Console.WriteLine(str);

因為PowerShell裡也整合了.Net的Library,所以如果不想用PowerShell的-replace也可以直接在PowerShell用.Net的Replace方法,所以C#的方法也可以直接在PowerShell上使用,程式碼就會變成

$source = "Hello World"
$str = $source.Replace("World", "PowerShell")
echo $str

邏輯運算子

邏輯運算子大家都知道是AND, OR, NOT運算,也知道在程式語言裡的表示方法為&&, ||, !,但PowerShell就不是這樣表達的,下表為PowerShell與C#邏輯運算子的表達方式:


運算子
C#
PowerShell
AND
&&
-and
OR
||
-or
NOT
!
-not!
XOR
^
-xor


範例:


[int] $inputA = Read-Host "Enter number A:"
[int] $inputB = Read-Host "Enter number B:"

If($inputA -is [int] -and $inputB -is [int]) {
    echo "Correct"
} Else {
    echo "Error Type"
}


位元運算子

位元運算子是用來進行二進制運算的運算子,下表為PowerShell與C#位元運算子的表達方式:


運算子
C#
PowerShell
Binary AND
&
-band
Binary OR
|
-bor
Binary NOT
~
-bnot
Binary XOR
^
-bxor


範例:


[int] $inputA = Read-Host "Enter number A:"
[int] $inputB = Read-Host "Enter number B:"
echo (-bnot $inputA)
echo ($inputA -band $inputB)


範例中如果我們輸入A為1, B為0的話,結果會印出-2與0,-2為1的binary not值,將00000000轉換成11111111;0為1和0的binary and值,將00000001與00000000進行and運算,結果得到00000000。

型別運算子

型別運算子主要是來比較型別之間是否相等或型別之間的轉換,下表為PowerShell與C#型別運算子的表達方式:


運算子
C#
PowerShell
IS
is
-is
ISNOT
!(is)
-isnot
AS
as
-as

範例:


$input = Read-Host "Enter number string:"
If($input -is [string]) {
    $num = $input -as [int]
    echo ($num * 100)
}

範例中,我們輸入一個數字字串,程式會去判斷是否為string型別,如果是就將string轉型為int進行數值運算。

範圍運算子

範圍運算子..,就是設定一個範圍區間內的數值給陣列,例如:


$ary = @(1..5)
Foreach($i in $ary) {
    echo $i
}

上述程式碼的結果會印出1 2 3 4 5,使用@(1..5)代表將1~5之間的數值Assign給變數$ary。(注意:範圍運算子的範圍只能以整數表示)



格式運算子

格式運算子-f,就是可以將.Net格式機制在PowerShell也能使用,如日期字串的格式, 數值字串的格式...等。使用規則如下:


"格式規則字串" -f 字串1, 字串2...

範例:


echo ("{0:c}" -f  100)
$date = Get-Date
echo ("{0:D}" -f $date)
echo ("{0:N3}" -f (10/3))
echo ("{0:x}" -f 255)
echo ("{0:p}" -f 0.99)

執行結果:







關於格式機制的識別字可參考 ToString方法的數值格式化與日期格式化
參考來源:
Windows PowerShell講座(6)—運算子(上)
Windows PowerShell 講座 (7)—運算子(下)





留言