首頁 美術繪圖 | 美術設計 | 熱門標籤 | 首選 | 首頁宣傳 | 近期作品 論壇: 發表 | 美術工作 | 美術比賽 | 展覽活動 | 美術相關 | 一般討論 | 美術同好 CG 討論 :: Photoshop | Painter | 3D 行動 | AMP

【 立即註冊 】 : 更改個人資料 : : 登入

會員名稱: 登入密碼: 保持登入

PowerShell 語法說明/範例教學

發表新主題 回覆主題 討論區 Windows, Linux, Perl, PHP, C/C++, Driver, Web 理論、應用、硬體、軟體

| 1頁, 共1
人氣點閱:50795 發表人
PowerShell 語法說明/範例教學 2011-11-16 16:37
/ / /

PowerShell 語法參考教學

PowerShell Assignment Operator 變數與指定運算子



指定運算子可讓您對變數指定單一數值 (純量) 或多重數值 (陣列)。您也可以將變數
轉換成任何 .NET 資料型別,以及使用單一命令對多個變數指定值。

Windows PowerShell 支援下列指定運算子:

代碼:

    運算子   描述
    -------- --------------------------------------------------------
    =        將變數的值�]定為指定的值
    +=       將變數的值�[上指定的值
             或附�[至�{有的值
    -=       將變數的值減去指定的值
    *=       將變數的值乘以指定的值
             或附�[至�{有的值
    /=       將變數的值除以指定的值
    %=       將變數的值除以指定的值
             然後將餘數 (模數) 指定給變數


= 指定運算子
若要指定單一值,請輸入變數的名稱 (以 $ 開頭) 加上 = 指定運算子,再加上要指定
給變數的值。例如,若要將值 6 指定給 $a 變數,請輸入:

$a = 6

若要將字串值指定給變數,請將字串值置於雙引號中。例如:

$a = "baseball"

您也可以使用 = 運算子指定陣列給變數。若要指定陣列的元素,請以逗號分隔
元素值。例如,

代碼:

        $a = "apple", "orange", "lemon", "grape"


指定陣列後,您可以使用索引 (起始位置為 0) 來參照陣列中的元素。請將索引置於方
括號中。例如,若要參照 $a 陣列中的第一個元素,請輸入:

代碼:

        $a[0]


若要參照第三個元素,請輸入:

代碼:

        $a[2]



Windows PowerShell 也允許您將關聯陣列指定給變數。在關聯陣列中,值會與「索引
鍵」相關聯,「索引鍵」就是您所定義的標籤。請在指定陣列給變數時指定索引鍵。
例如,若要將關聯陣列指定給 $a 變數,請輸入:

代碼:

        $a = @{one=1; two=2; three=3}


此範例將值 1、2 和 3 指定給 $a 變數,而且每個值各有其索引鍵。1 的索引鍵為
"one",2 的索引鍵為 "two",3 的索引鍵為 "three"。

使用下列格式即可參照關聯陣列中的值:

<陣列>.<索引鍵>

例如,若要顯示 2,請輸入:

代碼:

       $a.two


您也可以指定十六進位值給變數。例如,若要將值 0x10 指定給 $a 變數,請輸入:

代碼:

       $a =  0x10


當您輸入上述命令時,Windows PowerShell 會將十六進位值 (0x10) 轉換成十進位值
(就本例而言即 16),並將轉換後的值視同整數 (Int32) 資料型別而指定給 $a 變數。

您也可以指定指數值給變數。為此,請指定底數、字母 "e" 以及代表 10 的倍數的數
字。例如,若要指定 3.2573 的 1000 次方,請輸入:

代碼:

       $a = 3.2573e3


位於 "e" 後面的 "3" 指示 Windows PowerShell 應計算底數的 1000 次方。因此,指
定給變數的值為 3257.3。若要計算此數字的 10 次方,請輸入 "3.2573e1"。若要計
算此數字的 100 次方,請輸入 "3.2573e2"。

Windows PowerShell 也能將指定給變數的值從千位元組 (KB)、百萬位元組 (MB) 和十
億位元組 (GB) 轉換成位元組。例如,若要將 10 KB (千位元組) 指定給 $a 變數,請
輸入:

代碼:

       $a = 10kb


當您執行此命令時,Windows PowerShell 會將值 10,240 指定給變數。

= 指定運算子
+= 運算子會累加 (增加) 或附加變數的現有值,取決於變數屬於數字或字串資料
型別,以及變數係設為純量或陣列而定。

+= 運算子結合兩種運算:先執行加法,再進行指定。因此,

代碼:

       $a += 2


相當於:

代碼:

       $a = ($a + 2)


如果變數是數字純量值,請使用 += 運算子將運算子右邊所指定的數額累加到現有
的值。例如,假設 $a = 8;若要將其值增加 2,請輸入:

代碼:

       $a += 2


變數的值若為字串像是 "happy",則會將 2 附加至字串,因此結果值將是 "happy2"。

變數的值若為陣列 (數字或字串),+= 運算子便會將值為 2 的元素附加至陣列。

例如,假設 $a = 1,2,3,4,則 "$a += 2" 的結果為 $a = 1,2,3,4,2。

-= 指定運算子
-= 運算子會將現有的數值遞減 (減去) 運算子右邊所指定的值。此運算子不能用在字
串變數。

-= 運算子結合兩種運算:先執行減法,再進行指定。因此,

代碼:

        $a -= 2


相當於:

代碼:

        $a = ($a - 2)



例如,若要將 $a 變數的值減去 2,請輸入:

代碼:

        $a -= 2


如果儲存在 $a 中的值為 8,執行運算後 $a 所包含的值則為 6。再次執行命令將
使 $a 所包含的值變成 4。

-= 指定運算子也可以用在數字陣列。為此,請指定所要變更之陣列元素的索引。
例如,

代碼:

        $a = 1,2,3


使用下列命令即可變更第三個值 (索引位置 2):

代碼:

        $a[2] -= 1


此命令會將第三個值減去 1,所以變數如今等於 1, 2, 2。

*= 指定運算子
*= 運算子會將現有的變數值乘以運算子右邊所指定的值。如果變數包含數字純量值,
便將其值乘以指定值。例如,假設 $a 設為 3,則下列命令會將其值設為 12:

代碼:

        $a *= 4


*= 運算子結合兩種運算:先執行乘法,再進行指定。因此,

代碼:

        $a *= 2


相當於:

代碼:

        $a = ($a * 2)


然而,如果 $a 是字串值,Windows PowerShell 便會將指定的數字當成字串的數目,
然後將該數目的字串附加至其值。

例如,假設 $a 變數設為 "Apple",則:

代碼:

        $a *= 4


會使 $a 的值變成

代碼:
   
    "AppleAppleAppleApple"。


若要對陣列的元素執行乘法,請使用索引來識別所要變更的元素。例如,下列命令將
陣列中的第一個元素 (索引位置 0) 乘以 2。

代碼:

        $a[0] *= 2



/= 指定運算子
/= 運算子會將數字值除以運算子右邊所指定的值。此運算子不能用在字串變數。

/= 運算子結合兩種運算:先執行除法,再進行指定。因此,

代碼:
       
        $a /= 2


相當於:

代碼:

        $a = ($a / 2)


例如,若要將 $a 的值除以 2,請輸入:

代碼:

        $a /= 2


如果 $a 原本等於 8,執行命令後將使該變數變成 4。再次執行命令則會將變數
設為 2。

若要對陣列的元素執行除法,請使用索引來識別所要變更的元素。例如,下列命令將
陣列中的第二個元素 (索引位置 1) 除以 2。

代碼:

        $a[1] /= 2



%= 指定運算子
%= 運算子會將現有的變數值除以指定值,然後將餘數 (稱為「模數」) 指定給變數。
此運算子只能用在數字純量變數,而不能用在字串變數或是包含陣列的變數。

%= 運算子結合兩種運算:先執行除法並算出餘數,再將餘數指定給變數。因此,

代碼:

        $a %= 2


相當於:

代碼:

        $a = ($a % 2)


例如,假設 $a 所包含的值為 5,則下列命令會將其值變更為 1。

代碼:

        $a %= 2


.NET 資料型別
根據預設,純量變數的資料型別取決於變數指定值的第一個元素。例如,下列命令會
將變數轉換成 int (整數) 型別:

$a = 6

如需確認變數的資料型別,請使用 GetType() 方法。例如,若要檢視目前指定給 $a
的型別,請輸入:

代碼:

        $a.gettype()


您可以將指定值置於雙引號中,進而將變數轉換成字串型別:

代碼:

        $a = "6"


如果最初指定的值是字串,Windows PowerShell 便會將所有的運算都視為字串運算,
並將新值轉換成字串。

例如,

代碼:

        $a = "6"
        $a += 3


會使變數的新值變成字串值 "63"。

如果最初指定的值是整數,則 Windows PowerShell 會將所有的運算都視為整數運算,
並將新值轉換成整數。

例如,

代碼:

        $a = 6
        $a += "3"


會使新值變成整數值 9。

您可以將資料型別名稱置於方括號中,然後放在變數名稱或第一個指定值的前面,進而
將新的純量變數轉換成任何 .NET 資料型別。

轉換變數型別有助於判斷變數中所能儲存的資料型別,以及變數受操控時的行為模式。

例如,下列命令會將變數轉換成字串型別:

代碼:

        [string]$a = 27.5


初始化新變數時,在指定值的前面加上型別名稱也能達到同樣的效果:

代碼:
       
        $a = [string]27.5


將變數轉換成特定型別時,一般慣例通常是轉換變數本身而非轉換其值的型別。然而,
若是對現有的變數指定值,則會因為資料型別名稱的位置不同而有所差異。

例如,假設 $a 包含字串值 "three";若要將其值指定為整數 3,應將資料型別名稱放
在指定值的前面而非變數名稱前面。如果放在變數名稱前面,Windows PowerShell
便會顯示錯誤,指出無法嘗試將字串值 ("three") 轉換成整數。

此外,將資料型別放在變數名稱前面會鎖定變數的型別,除非您藉由指定其他資料型別
以明確置換型別。若您並未明確置換型別,以致嘗試指定的值與現有的型別不相容,
Windows PowerShell 便會顯示錯誤。

Windows PowerShell 在處理陣列變數的資料型別方面,做法上有別於處理純量變數的
資料型別。陣列變數若未明確指定資料型別,則其資料型別始終都是 object[],這是
陣列特有的型別。在某些情況下,您可藉由指定其他型別來置換此預設型別。
例如,下列命令將變數轉換成 string[] 陣列型別:

代碼:

        [string[]]$a = "one", "two", "three"


Windows PowerShell 變數可以是任何 .NET 資料型別。此外,您亦可指定目前處理序
所適用的任何完整格式 .NET 資料型別。例如,下列命令指定了 System.Datetime
型別:

代碼:

        [system.datetime]$a = "5/31/2005"


指定給變數的值屬於 datetime 型別。因此,$a 變數的值將會是
"Tuesday, May 31, 2005 12:00:00 AM"。

指定多重變數
在 Windows PowerShell 中,您可以使用單一命令對多個變數指定值。指定值的第一
個元素會指定給第一個變數,第二個元素指定給第二個變數,第三個元素指定給第
三個變數,依此類推。例如,下列命令將 1 指定給 $varA,將 2 指定給 $varB,
並將 3 指定給 $varC:

代碼:

        $varA, $varB, $varC = 1, 2, 3


如果指定值包含的元素數目比變數的個數還要多,多出的值則全部指定給最後一個變
數。例如,下列命令包含三個變數,卻指定了五個值:

代碼:

        $varA, $varB, $varC = 1, 2, 3, 4, 5


在此情況下,Windows PowerShell 會將 1 指定給 $varA,將 2 指定給 $varB,並將
3、4 和 5 指定給 $varC。

若要將 $varC 中的值再指定給其他三個變數,請使用下列格式:

代碼:

        $varD, $varE, $varF = $varC


指定給 $varD 的值為 3,指定給 $varE 的值為 4,指定給 $varF 的值則為 5。

您也可以鏈結變數而將單一值指定給多個變數。例如,下列命令將值 "three" 同時指
定給四個變數:

代碼:

        $varA = $varB = $varC = $varD = "three"


這四個變數如今都指定了相同的值。

與變數相關的 CMDLET
除了透過指定運算來設定變數值之外,您還可以使用 Set-Variable cmdlet。例如,
若要將 1, 2, 3 陣列指定給 $varA 變數,請使用下列命令:

代碼:

        Set-Variable -name varA -value 1, 2, 3


Windows PowerShell 也隨附了與變數相關的其他 cmdlet,包括 Clear-Variable 和
Remove-Variable。Clear-Variable cmdlet 用於清除指定之變數的現有值。對於
字串變數,Clear-Variable cmdlet 會將變數設定成值為 null 的運算式。對於
數字變數,此 cmdlet 則會將變數設為 0。

Remove-Variable cmdlet 用於刪除指定的變數。這可幫您省去重新輸入變數的繁複工
作。也就是說,您可以使用此 cmdlet 移除變數再重新初始化該變數。

PowerShell 保留字元/



某些單字在 PowerShell 中具有特殊意義。當這些字詞出現在引號外面時,
PowerShell 會嘗試套用其特殊意義,而非視為純粹的字元字串。若您想要
在命令或指令碼中使用這些字詞做為參數引數,也就是抑制其特殊意義,
請將保留字置於引號中。

以下是 PowerShell 中的保留字:

語言陳述式
代碼:
   
    break       continue     do           for
    foreach     while        if           switch
    until       where        function     filter


陳述式語法
代碼:
   
    else     elseif     in     return 


PowerShell "If" 判斷式語法



透過使用 if 陳述式,可以在指定的條件測試評估為 true 時執行某個程式碼區塊。您
也可以在先前所有的測試評估為 false 時,另外指定一或多個額外的條件進行
測試。最後,您還可以額外指定一個程式碼區塊,於前述所有的條件測試均未評估
為 true 時予以執行。

if 陳述式的語法如下:

代碼:

        if (test1)
        {
       
         }
        elseif (test2)
        {
       
        }
        else
        {
           
        }


當您執行 if 陳述式時,Windows PowerShell 會評估 <測試1> 條件運算式為
true 或 false。若 <測試1> 結果為 true,PowerShell 便會執行 <程式碼區塊1>
然後結束 if 陳述式。若 <測試1> 結果為 false,PowerShell 則繼續評估 <測試2>
所指定的條件。若 <測試2> 結果為 true,PowerShell 便會執行 <程式碼區塊2>
然後結束 if 陳述式。如果 <測試1> 和 <測試2> 均評估為 false,PowerShell 即
執行 <程式碼區塊3> 然後結束 if 陳述式。

您可以使用多個 elseif 陳述式鏈結一連串條件測試,鏈結中的每項測試只有在其前項
測試結果為 false 時才進行評估。附註:如果您所建立的 if 陳述式內有為數眾多的
elseif 陳述式,請考慮改用 switch 陳述式。

最簡單的 if 陳述式沒有任何 elseif 陳述式或 else 陳述式,且程式碼區塊中只包含
單一命令。最簡單的 if 陳述式型式如下:

代碼:

        if ($a -gt 2)
        {
            Write-Host " $a > 2 "
        }


在此範例中,如果 $a 大於 2,則條件評估為 true 因而執行程式碼區塊。然而,如
果 $a 小於或等於 2 或不是現存的變數,if 陳述式就不會顯示任何訊息。加入
else 陳述式之後,即可確保在 $a 小於或等於 2 時顯示訊息,如以下範例所示:

代碼:

        if ($a -gt 2)
        {
            Write-Host " $a > 2"
        }
        else
        {
            Write-Host " $a <= 2"
        }


為進一步改良此範例,您可以使用 elseif 陳述式,在 $a 的值等於 2 時顯示訊息,
如以下範例所示:

if ($a -gt 2)
{
Write-Host " $a > 2"
}
elseif ($a -eq 2)
{
Write-Host " $a == 2"
}
else
{
Write-Host " $a < 2"
}



PowerShell Array 陣列語法


若要建立並初始化陣列,請對變數指定多重數值。儲存在陣列中的值以逗號分隔,並
使用指定運算子 (=) 隔開變數名稱和值。

例如,若要建立名稱為 $A 的陣列,且包含七個數字 (int) 值 22、5、10、8、12、9
和 80,請輸入:

代碼:

       $A = 22,5,10,8,12,9,80


您也可以使用範圍運算子 (..) 建立並初始化陣列。例如,若要建立並初始化名稱為
"$B" 且包含數值 5 到 8 的陣列,請輸入:

代碼:

       $B = 5..8


在此情況下,$B 包含了四個數值:5、6、7 和 8。

如果沒有指定資料型別,Windows PowerShell 會將每個陣列建立成物件陣列 (型別為
object[])。若要判斷陣列的資料型別,請使用 GetType() 方法。例如,若要判斷 $a
陣列的資料型別,請輸入:

代碼:

       $a.gettype()


若要建立強型別 (Strongly Typed) 陣列,也就是只能包含一種特定型別值的陣列,請
將變數轉換成陣列型別,例如 string[]、long[] 或 int32[]。若要轉換陣列的型別,
請將陣列型別置於方括號中,然後放在變數名稱前面。例如,若要建立名稱為
$ia 的 32 位元整數陣列,並包含四個整數 (1500、2230、3350 和 4000),請輸入:

代碼:

       [int32[]]$ia = 1500,2230,3350,4000


在此情況下,$ia 陣列只能包含整數。

您可以利用型別轉換,將陣列建立成 .NET Framework 支援的任何型別。例如,
Get-Process 所擷取用來代表處理序的物件屬於 System.Diagnostics.Process 型別。
若要建立包含處理序物件的強型別陣列,請輸入下列命令:

代碼:

       [Diagnostics.Process[]]$zz = Get-Process


讀取陣列
您可以使用陣列的變數名稱 (例如 $A 或 $a) 來參照陣列。Windows PowerShell 不區
分大小寫。

若要顯示陣列中的所有元素,請輸入陣列名稱。例如:

代碼:

           $a


您可以使用索引 (起始位置為 0) 來參照陣列中的元素。請將索引編號置於方括號中。
例如,若要顯示 $a 陣列中的第一個元素,請輸入:

代碼:

        $a[0]


若要顯示 $a 陣列中的第三個元素,請輸入:

代碼:

        $a[2]


負數表示從陣列結尾起算。例如,"-1" 是指陣列中的最後一個元素。若要顯示陣列中
的最後 3 個元素,請輸入:

代碼:

        $a[-3..-1]


然而,使用這種標記法務必特別謹慎。

代碼:

        $a[0..-2]


並不是指陣列中除了最後一個元素之外的所有元素; 而是指陣列中的第一個、最後一
個元素,以及倒數第二個元素。

您可以使用範圍運算子來顯示陣列中所有值的子集。例如,若要顯示索引位置從 1 到
3 的資料元素,請輸入:

代碼:

        $a[1..3]


您可以使用加法運算子 (+) 來結合陣列中某範圍的元素。例如,若要顯示索引位置為
0 和 2 以及從 4 到 6 的元素,請輸入:

代碼:

        $a[0,2+4..6]


若要判斷陣列中的元素個數,請結合運用範圍與陣列的 length 屬性。例如,若要顯
示從索引位置 2 到陣列結尾的元素,請輸入:

代碼:

        $a[2..($a.length-1)]


length 減 1 是因為索引的起始位置為 0。換句話說,若陣列包含三個元素 (1,2,3),
則第三個元素的索引為 2,也就是陣列的長度減一。


您也可以使用迴圈建構,像是 foreach、for 和 while 迴圈來參照陣列中的元素。例
如,若要使用 foreach 迴圈來顯示 $a 陣列中的元素,請輸入:

代碼:

        foreach ($element in $a) {$element}


foreach 迴圈會重複處理陣列並傳回陣列中的每個值,直到抵達陣列結尾為止。

for 迴圈特別適用於以遞增計數器的方式檢查陣列中的元素。例如,若要使用 for 迴
圈來傳回陣列中索引位置為偶數的元素值,請輸入:

代碼:

        for ($i = 0; $i -le ($a.length - 1); $i += 2) {$a[$i]}


使用 while 迴圈可以顯示陣列中的元素,直到定義的條件不再為 true 為止。例如,
若要顯示 $a 陣列中陣列索引小於 4 的元素,請輸入:

代碼:

        $i=0
        while($i -lt 4) {$a[$i]; $i++}


如需瞭解陣列的屬性和方法,例如 Length 屬性和 SetValue 方法,請使用
Get-Member cmdlet 的 InputObject 參數。當您傳送陣列給 Get-Member
時,將會顯示陣列中的物件相關資訊。如果使用 InputObject 參數,則
會顯示陣列的相關資訊。

若要找出 $a 陣列的屬性和方法,請輸入:

代碼:

           get-member -inputobject $a



操控陣列
您可以變更陣列中的元素、為陣列新增元素,或結合兩個陣列中的值以構成第三個
陣列。

若要變更陣列中特定元素的值,請指定陣列名稱以及所要變更之元素的索引,然後使用
指定運算子 (=) 為元素指定新值。例如,若要將 $a 陣列中第二個元素 (索引位置 1)
的值變更為 10,請輸入:

代碼:

       $a[1] = 10


您也可以使用陣列的 SetValue 方法變更值。以下範例將 $a 陣列的第二個值 (索引
位置 1) 變更為 500:

代碼:

       $a.SetValue(500,1)


您可以使用 += 運算子為現有的陣列附加元素。此運算子會增加現有值。若對陣列的
元素使用此運算子,將會增加該元素的值。若對陣列本身使用此運算子,則會將值
附加至陣列。例如,若要將值為 200 的元素附加至 $a 陣列,請輸入:

代碼:

       $a += 200


要刪除陣列的元素並不容易,但您可從現有的陣列中選取元素另外建立新陣列。例如,
若要選取 $a 陣列中除了索引位置為 2 的所有元素,另外建立 $t 陣列,請輸入:

代碼:

       $t = $a[0,1 + 3..($a.length - 1)]


若要將兩個陣列結合為單一陣列,請使用加法運算子 (+)。以下範例建立兩個陣列並
將兩者結合為一,然後顯示結合的陣列結果。

代碼:

       $x = 1,3
       $y = 5,9
       $z = $x + $y


在此情況下,$z 陣列包含了 1、3、5 和 9。

若要刪除陣列,請使用 Remove-Item cmdlet 刪除包含該陣列的變數。下列命令指定
刪除 Variable: 磁碟機上的 "a" 元素。

代碼:

       remove-item variable:a           



PowerShell 雙引號 "" 單引號 '' 語法規則



在某些情況下,當您提供字元字串做為命令引數或是初始化字串變數時,可能需要用到
特殊字元或保留字。若要這樣做,您必須將字串置於引號中。例如,因為空格用於
分隔命令引數,任何包含空格的字元字串都必須置於引號中,才會被當成單一字串
來處理。

您可以使用單引號 (') 或雙引號 (") 括住字串。依您所使用的字元而定,置於引號
中之字串的處理方式會不同:

使用雙引號時,以貨幣符號 ($) 開頭的變數名稱會被取代為變數的值,然後再將字串
傳遞給命令進行處理。請看以下範例:

代碼:

       $i = 5
       Write-Host "The value of $i is $i"


此命令的輸出為:

代碼:

       The value of 5 is 5


使用單引號時,會將置於引號中實際輸入的字串內容傳遞給命令。並沒有取代的情形
發生。請看以下範例:

代碼:

       $i = 5
       Write-Host 'The value of $i is $i'


此命令的輸出為:

代碼:

       The value $i is $i


在以雙引號含括的字串中,若要將變數指定為常值,請使用抑音符號字元 (`)。抑音
符號是特殊的 Windows PowerShell 逸出字元。這個字元的按鍵位於一般 Qwerty
鍵盤的左上角, 通常與波狀符號 (~) 字元共用同一個按鍵。

以下範例在第一個 $home 變數前面加上抑音符號字元,以免 PowerShell 將變數名稱
取代為變數值。

代碼:

       Write-Host "`$home = $home"


此命令的輸出為:

代碼:

       $home = C:\Windows


您可以將雙引號放在成對的單引號中。以下範例示範這種做法:

代碼:

       Write-Host 'As they say, "live and learn."'


此命令的輸出為:

代碼:

       As they say, "live and learn."。


單引號也可以放在成對的雙引號中。


使用 ` 逸出字元就能照實輸出成對引號中的同一種引號,如下所示:

代碼:

      Write-Host 'It`'s easy to write literal statements in PowerShell.'


此命令的輸出為:

代碼:

      It's easy to write literal statements in PowerShell.


請注意 "It's" 這個詞當中的單引號仍然存在。


PowerShell 運算子語法


運算子是一種語言元素,讓您可以對 PowerShell 命令中的參數執行參數值運算動作。
例如,您可以將兩個值相加,或為變數指定值。PowerShell 支援六種運算子:
算術、指定、比較、邏輯、一元和特殊。

算術運算子
算術運算子用於計算命令中的值。使用這些運算子可將數值相加、相減、相乘或相除,
以及計算數值相除之後傳回的餘數。

指定運算子
指定運算子用於為變數指定值。您可以指定單一值 (純量) 給變數,也可以指定多個
值 (陣列) 給變數。變數亦可轉換成任何 .NET 資料型別,例如轉換成字串或十進位。

比較運算子
比較運算子用於比較數值和進行條件測試。例如,您可以比較兩個字串值,判斷兩者
是否相等。如果兩者相等,PowerShell 會傳回 true 的狀況,否則 PowerShell 將
傳回 false 的狀況。

邏輯運算子
邏輯運算子適用於含有多項條件測試的陳述式。邏輯運算子會連接這些條件,以便於
評估個別條件後進行整體評估。例如,假設陳述式包含兩項條件,其一測試兩個變數
是否相等,其二測試這兩個變數之一是否大於 10。在此情況下,使用邏輯運算子即
可連接這些條件以進行整體評估。

一元運算子
一元運算子用於遞增或遞減變數或物件屬性,以及將整數設為正數或負數。例如,若
要將變數 $a 從 9 遞增為 10,則可輸入 $a++。

特殊運算子
特殊運算子用於執行其他類型的運算子無法執行的工作。例如,特殊運算子可用於執
行命令以及變更數值的資料型別。

運算子優先順序
除了認識 PowerShell 支援的運算子類型之外,使用運算子時應該考量的另一項因素是
運算子優先順序。運算子優先順序的實際意涵是指 PowerShell 會依非常特定的順序
處理運算子。因此,如果您所建立的運算式包含多種運算子,就應更加留意此優先
順序。

運算子
預設情況下,比較運算子比較字串時基本上不區分大小寫。比較運算子也有區分大小
寫的變化形式,以及明確不區分大小寫的運算子。

代碼:

       -eq             相等 (不區分大小寫)
       -ne             不相等 (不區分大小寫)
       -ge             大於或等於 (不區分大小寫)
       -gt             大於 (不區分大小寫)
       -lt             小於 (不區分大小寫)
       -le             小於或等於 (不區分大小寫)
       -like           萬用字元比較 (不區分大小寫)
       -notlike        萬用字元比較 (不區分大小寫)
       -match          規則運算式比較 (不區分大小寫)               
       -notmatch       規則運算式比較 (不區分大小寫)
       -replace        取代運算子 (不區分大小寫)
       -contains       內含項目運算子 (不區分大小寫)
       -notcontains    內含項目運算子 (不區分大小寫)

        -ieq            不區分大小寫相等
        -ine            不區分大小寫不相等
        -ige            不區分大小寫大於或等於
        -igt            不區分大小寫大於
        -ile            不區分大小寫小於或等於
        -ilt            不區分大小寫小於
        -ilike          不區分大小寫萬用字元比較
        -inotlike       不區分大小寫萬用字元比較
        -imatch         不區分大小寫規則運算式比較
        -inotmatch      不區分大小寫規則運算式比較
        -ireplace       不區分大小寫取代運算子
        -icontains      不區分大小寫內含項目運算子
        -inotcontains   不區分大小寫內含項目運算子
        -ceq             相等 (區分大小寫)
        -cne             不相等 (區分大小寫)
        -cge             大於或等於 (區分大小寫)
        -cgt             大於 (區分大小寫)
        -clt             小於 (區分大小寫)
        -cle             小於或等於 (區分大小寫)
        -clike           萬用字元比較 (區分大小寫)
        -cnotlike        萬用字元比較 (區分大小寫)
        -cmatch          規則運算式比較 (區分大小寫)
        -cnotmatch       規則運算式比較 (區分大小寫)
        -creplace        取代運算子 (區分大小寫)
        -ccontains       內含項目運算子 (區分大小寫)
        -cnotcontains    內含項目運算子 (區分大小寫)
        -is             屬於某型別
        -isnot          不屬於某型別
        -as             轉換成某型別,轉換失敗時不會發生錯誤


可用的指定運算子如下
代碼:
   
        =       指定
        +=      遞增值然後指定
        -=      遞減值然後指定
        *=      乘以值然後指定
        /=      除以值然後指定
        %=      模除值然後指定



邏輯運算子
代碼:
   
        -and    邏輯 And
        -or     邏輯 Or


PowerShell if else and 範例
代碼:

        if (($varA -eq $varB) -and ($varB -gt 20))
        {
            Write-Host "TRUE: A==B and B > 20"
        }
        else
        {
            Write-Host "FALSE"
        }


位元運算子
代碼:
   
        -band   位元運算 and
        -bor    位元運算 or


重新導向運算子
代碼:
   
        2>&1    將錯誤併入為結果
        1>&2    將結果併入為錯誤
        >>      將結果附�[至檔案
        >       將結果建立為檔案,覆寫先前的檔案內容
        <       輸入自 (不支援)
        2>>     將錯誤附�[至檔案
        2>      將作業傳回的錯誤導向至具名檔案,覆寫先前的檔案內容


格式運算子
-f 格式運算子支援透過 .NET 字串物件的格式化方法將字串格式化。運算
子左邊是格式字串,運算子右邊則是所要格式化的物件集合。
以下範例示範格式運算子的部分功能。
代碼:
             
             PS> "{0} {1,-10} {2:N}" -f 1,"hello",[math]::pi
             1 hello      3.14




PowerShell "foreach" 語法


foreach 陳述式 (也稱為 foreach 迴圈) 是一種語言建構,用以逐項 (反覆) 處理項
目集合中的一連串數值。

最簡單且最常周遊的集合類型是陣列。foreach 迴圈內部常會對陣列中的每個項目執
行一或多個命令。

foreach 陳述式的語法如下:

foreach ($<項目> in $<集合>){<命令區塊>}

位於命令管線外的 FOREACH 陳述式
foreach 陳述式置於括號中的部分 ($<項目> in $<集合>) 代表變數以及所要反覆處理
的集合。Windows PowerShell 會在 foreach 迴圈執行時自動建立變數 ($<項目>)。
每次反覆處理迴圈之前,會先將此變數設定為集合中的某個值。foreach 陳述式
後面的區塊 {<命令區塊>} 包含了要對集合中的每個項目執行的一組命令。

例如,下列 foreach 迴圈範例將顯示 $letterArray 陣列中的值:

代碼:

        $letterArray = "a","b","c","d"
        foreach ($letter in $letterArray)
        {
            Write-Host $letter
        }


此範例使用字串值 "a"、"b"、"c" 和 "d" 建立並初始化 $letterArray。接著,當
foreach 陳述式初次執行時,便會將 $letter 變數設定為 $letterArray 中的第一個
項目 ("a"),然後使用 Write-Host Cmdlet 顯示字母 a。第二次通過迴圈時,
$letter 則設定為 "b",依此類推。直到 foreach 迴圈顯示字母 d 之後,PowerShell
隨即結束迴圈。

請注意,從 PowerShell 命令提示字元輸入時,整個 foreach 陳述式必須寫成一行才
能執行命令。若將命令置於 .ps1 指令檔則無此必要。

Foreach 陳述式也能與傳回項目集合的 Cmdlet 搭配使用。在下列範例中,foreach 陳
述式將逐項處理 Get-ChildItem Cmdlet 所傳回的項目清單:

代碼:

        foreach ($file in Get-ChildItem)
        {
            Write-Host $file
        }


您可以修改上述範例,使用 if 陳述式限制傳回的結果。在下列範例中,foreach 陳
述式不僅執行與上述範例相同的迴圈處理作業,還加入 if 陳述式將結果限制為大小
超過 100 KB 的檔案:

代碼:

        foreach ($file in Get-ChildItem)
        {
            if ($file.length -gt 100k)
            {
                Write-Host $file
            }
        }


請注意,在此範例中,foreach 迴圈會利用 $file 變數的屬性執行比較運算
($file.length -gt 100k)。$file 變數包含了 Get-ChildItem Cmdlet 所傳回物件的
全部屬性。因此,您還能傳回檔名以外的其他資訊。在下列範例中,
PowerShell 於命令區塊內傳回長度和上次存取時間:

代碼:

        foreach ($file in Get-ChildItem)
        {
            if ($file.length -gt 100k)
            {
                Write-Host $file
                Write-Host $file.length
                Write-Host $file.lastaccesstime
            }
        }


另請注意,如上述範例所示,命令區塊內可執行一個以上的命令。

您也可以在 foreach 迴圈外使用變數,而在迴圈內遞增其值。下列範例在迴圈
外將 $i 變數設為 0,且迴圈內每找到一個大於 100 KB 的檔案時便遞增其值。
結束迴圈後,if 陳述式會評估 $i 的值以顯示所有超過 100 KB 的檔案數目,
或顯示訊息表示找不到大於 100 KB 的檔案。

代碼:

        $i = 0
        foreach ($file in Get-ChildItem)
        {
            if ($file.length -gt 100k)
            {
                Write-Host $file "檔案大小:" ($file.length / 1024).ToString("F0") KB
                $i = $i + 1
            }
        }

        if ($i -ne 0)
        {
            Write-Host $i " 個檔案超過 100 KB 位於目前的目錄中。"
        }
        else
        {
            Write-Host "目前的目錄中找不到大於 100 KB 的檔案。"
        }


上述範例也示範如何利用 ($file.length / 1024).ToString("F0") 將檔案長度結果格
式化。長度值先除以 1024 而從位元組改為顯示以 KB 為單位的結果,然後使用固定
小數點格式指定元移除結果中的小數點。當中的 0 係指示格式指定元不應顯示任何
小數位數。

位於命令管線內的 FOREACH 陳述式
每當 foreach 出現在命令管線內,PowerShell 便會使用 foreach 別名藉以呼叫
Foreach-Object。若在命令管線內使用 foreach 別名,就不必加上 foreach 陳述式
應有的 ($<項目> in $<集合>) 語法。這是因為管線內的上一個命令會提供此
資訊。用於命令管線內的 foreach 使用下列語法:

<命令> | foreach {<命令區塊>}

例如,下列命令管線內的 foreach 迴圈將顯示工作組 (記憶體使用量) 大於 20 MB 的
所有處理序。PowerShell 會將 Get-Process 命令的輸出傳送給 foreach 別名。而在
foreach 別名的命令區塊內,$_.WS 包含了由 Get-Process Cmdlet 傳來的
WS (工作組) 屬性的值 (宣告的 $_ 部分是 WSH 自動變數,WS 部分則是屬性)。
接著 if 陳述式使用條件陳述式判斷工作組是否大於 20 MB (20000000 位元組)。
如果是,便會顯示處理序的名稱 (儲存於 $_.name) 以及工作組的大小
(以百萬位元組為單位)。若所有的處理序工作組都不超過 20 MB,就不會
顯示任何資訊。

代碼:

       Write-Host "WorkSet > 20MB Process"
       Get-Process | foreach {
       if ($_.WS -gt 20m)
           {
               Write-Host $_.name ":"
               ($_.WS/1m).ToString("F0") MB -Separator ""
           }
       }


foreach 別名也支援起始命令區塊、中間命令區塊以及結尾命令區塊標記法。起始與
結尾命令區塊僅執行一次,中間命令區塊則是在 foreach 迴圈每次逐項處理集合或
陣列時都會執行。

在命令管線內使用,且包含起始、中間與結尾命令區塊之 foreach 別名的語法如下:

<命令> | foreach {<起始命令區塊>}{<中間
命令區塊>}{<結尾命令區塊>}

下列範例示範起始、中間與結尾命令區塊的用法。

代碼:

       Get-ChildItem | foreach {
       $fileCount = $directoryCount = 0}{
       if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}{
       "$directoryCount 個目錄與 $fileCount 個檔案"}


* 起始區塊:{$fileCount = $directoryCount = 0} 建立兩個變數並將其初始化
為 0。
* 中間區塊:{if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}
評估 Get-ChildItem 所傳回的每個項目屬於目錄或檔案。若是目錄便將
$directoryCount 變數遞增 1,若不是目錄則將 $fileCount 變數遞增 1。
* 結尾區塊:{"$directoryCount 個目錄與 $fileCount 個檔案"} 等到中間區塊完成
迴圈處理作業後才執行,以輸出作業的結果。

您可以使用命令管線加上起始、中間與結尾命令區塊結構改寫稍早的範例,找出大小超
過 100 KB 的檔案,如下所示。

代碼:

   Get-ChildItem | foreach{$i = 0}
   {
       if ($_.length -gt 100k)
       {
           Write-Host $_.name "檔案大小:" ($_.length / 1024).ToString("F0") KB
           $i++
       }
   }
   
   if ($i -ne 0)
   {
       Write-Host "There are $i files which are 100KB+"
   }
   else
   {
       Write-Host "NO 100KB+ Files"
   
   }


PowerShell While Loop 迴圈



while 陳述式 (也稱為 while 迴圈) 是一種建立迴圈的語言建構,在條件測試評估結
果為 true 時,便不斷執行命令區塊內的命令。while 陳述式的語法較單純,所以
比 for 陳述式更容易建構。此外,while 陳述式比 foreach 陳述式更有彈性,因為
while 陳述式可以指定條件測試進而控制迴圈執行次數。

while 陳述式的語法如下: while (<條件>){<命令區塊>}

執行 while 陳述式時,Windows PowerShell 會先評估陳述式的 <條件> 部分,以決定
是否進入 <命令區塊> 部分。陳述式的 <條件> 部分會解析成 true 或 false。只要
條件仍為 true,PowerShell 就不斷執行 <命令區塊> 部分。

陳述式的 {<命令區塊>} 部分包含了每次進入或重複迴圈時執行的一或多個命令。

例如,下列 while 陳述式會在 $val 變數尚未建立,或已建立並初始化為 0 的情況下
顯示數字 1 到 3。

代碼:

        while($val -ne 3)
        {
            $val++
            Write-Host $val
        }


在此範例中,只要 $val = 0、1、2,條件 ($val 不等於 3) 即為 true。每次通過迴
圈時,會使用 ++ 一元遞增運算子 ($val++) 將 $val 遞增 1。最後一次通過迴圈時,
則 $val = 3。一旦 $val 等於 3,條件陳述式即評估為 false 因而結束迴圈。

為便於從 PowerShell 命令提示字元輸入此命令,您可以採用底下這種寫法:

代碼:

        while($val -ne 3){$val++; Write-Host $val}



PowerShell For Loop 迴圈語法



for 陳述式 (也稱為 for 迴圈) 是一種建立迴圈的語言建構,在指定的條件評估為
true 時執行命令區塊內的特定命令。

for 迴圈經常用於反覆處理數值陣列中的數值子集。一般而言,若您想要反覆處理陣
列中所有的值,請考慮改用 foreach 陳述式。

for 陳述式的語法如下:

代碼:

        for (init-value; break-condition; iteration-setup)
        {
        }


<初值> 是在迴圈開始前先執行的單一命令或以逗號分隔的多個命令。陳述式的
<初值> 部分通常用於建立變數並將其初始化為起始值。此變數接著將成為 for
陳述式下一部分在條件測試時的依據。

<條件> 是 for 陳述式中解析為布林值 true 或 false 的部分。PowerShell 每次執
行 for 迴圈時都會評估此條件。若其陳述式為 true,便會執行 <命令區塊> 內的
命令,然後再次評估其陳述式。如果條件仍為 true,則再度執行 <命令區塊>
內的命令,依此方式不斷檢查,直到條件變成 false 為止。

<重複方式> 是在每次重複迴圈時執行的單一命令或以逗號分隔的多個命令。此部分通
常用於修改陳述式的 <條件> 部分所測試的變數。

<命令區塊> 是在每次進入或重複迴圈時執行的單一命令或一組命令。<命令區塊> 的
內容置於大括號中。

for 陳述式至少必須有 <初值>、<條件> 和 <重複方式> 部分 (三者置於括號中),以
及包含單一命令的 <命令區塊> 部分 (命令置於大括號中)。

附註:接下來的範例刻意將程式碼寫在 for 陳述式外面。後續的範例會陸續將這些程
式碼整併到 for 陳述式中。

例如,下列 for 陳述式將不斷顯示 $i 變數的值,直到您按 Ctrl+C 手動退出命令為
止。

代碼:

        $i = 1
        for (;;){Write-Host $i}



您可以在 <命令區塊> 內添加一些命令,比方每次通過迴圈都使 $i 的值遞增 1,如以
下範例所示:

代碼:

        for (;;){$i++; Write-Host $i}


在您按下 Ctrl+C 退出命令之前,此陳述式會不斷顯示 $i 變數的值,因為每次通過迴
圈時其值都將遞增 1。

您也可以改用 for 陳述式的 <重複方式> 部分變更變數的值,而不使用 for
陳述式的 <命令區塊> 部分。

代碼:

      $i=1
      for (;;$i++){Write-Host $i}


這時仍會不斷重複迴圈,直到您按 Ctrl+C 退出命令為止。

藉由設定條件 (使用 for 陳述式的 <條件> 部分),即可在條件評估為 false 時結束
迴圈。在下列範例中,只要 $i 的值小於或等於 10 就會不斷執行 for 迴圈。

代碼:

      $i=1
      for(;$i -le 10;$i++){Write-Host $i}


除了在 for 陳述式外面建立並初始化變數之外,您也可以使用 for 陳述式的 <初值>
部分,在 for 迴圈內執行相同的工作。

代碼:

      for($i=1; $i -le 10; $i++){Write-Host $i}


您可以使用換行字元代替分號,分隔 for 陳述式的 <初值>、<條件> 和 <重複方式>
部分。這種替代格式的 for 陳述式語法如下:

代碼:

      for (<初值>
      <條件>
      <重複方式>){
      <命令區塊>
      }


這種替代格式的 for 陳述式可運作於 PowerShell 指令檔及 PowerShell 命令提示字
元。然而,在主控台上輸入互動式命令時,使用帶有分號的 for 陳述式語法會比較
方便。

for 迴圈比 foreach 迴圈更有彈性,能讓您使用模式來遞增陣列或集合中的值。下列
範例使用 for 陳述式的 <重複方式> 部分將 $i 變數遞增 2:

代碼:

      for ($i = 0; $i -ile 20; $i += 2) {Write-Host $i}



PowerShell 流程 Continue 語法




指令碼可以使用 continue 陳述式,讓程式流程立即移至下列任何一種陳述式所控制的
最內部迴圈起始處:

* for
* foreach
* while

範例

在此範例中,當 $ctr 等於 5 時,程式流程就會返回 while 迴圈起始處。其執行結果
將顯示從 1 到 10 但 5 除外的所有數字。

代碼:

    while ($ctr -lt 10)
         {
              $ctr +=1
              if ($ctr -eq 5) {continue}
              Write-Host $ctr
         }



PowerShell 流程 Break 語法


在 foreach、for、while、do 迴圈或 switch 陳述式的程式碼區塊中,使用 break 陳
述式便可結束程式碼區塊。對於迴圈陳述式,break 陳述式會使迴圈結束。對於
switch 陳述式,break 陳述式則會使 switch 陳述式內部的程式碼區塊結束,進而
結束整個 switch 陳述式。

下列範例示範如何使用 break 陳述式來結束 for 陳述式:

代碼:

        for($i=1; $i -le 10; $i++)
        {
            Write-Host $i
            break
        }


在此情況下只要 $i 等於 1,break 陳述式隨即結束 for 迴圈。儘管 for 陳述式評估
為 true 的條件是 $i 大於 10,但 Windows PowerShell 初次通過 for 迴圈時就會
遇到break 陳述式。

break 陳述式通常出現在迴圈內部,符合內部條件後才會執行。請看以下的
foreach 陳述式範例:

代碼:

        $i=0
        $varB = 10,20,30,40
        foreach ($val in $varB)
        {
            $i++
            if ($val -eq 30)
            {
                break
            }
        }
        Write-Host "30 was found in array position $i"


在此範例中,foreach 陳述式會重複檢查 $varB 陣列。每次通過程式碼區塊後,$i 變
數都將遞增 1。而前兩次通過迴圈時,內部的 if 陳述式均評估為 false。當第三次
通過迴圈時,$i 即等於 3 且 $val 變數等於 30,因而執行 break 陳述式以致結束
foreach 迴圈。

以中斷方式結束 foreach 迴圈的做法同樣適用於結束其他的迴圈陳述式。在下列範例
中,當 while 陳述式使用 trap 陳述式截獲 DivideByZeroException 時,break
陳述式便會予以結束。

代碼:

        $i = 3
        while ($true)
        {
            trap [DivideByZeroException]
            {
                Write-Host "divide by zero trapped"
                break
            }
            1 / $i--
      }


switch 陳述式並不屬於迴圈建構,但 break 陳述式仍相當實用,可在符合特定條件時
結束程式流程。例如,下列 switch 陳述式使用 break 陳述式來測試最確切的條件:

代碼:

       $var = "word2"
       switch -regex ($var)
       {
           "word2"
           {
               Write-Host "Exact" $_
               break
           }

           "word.*"
           {
               Write-Host "Match on the prefix" $_
               break
           }

           "w.*"
           {
               Write-Host "Match on at least the first letter" $_
               break
           }

           default
           {
               Write-Host "No match" $_
               break
           }
       }


此範例建立 $var 並將其初始化為字串值 "word2"。switch 陳述式使用 regex (規則
運算式 .NET 類別) 先將變數值與 "word2" 進行比對。由於變數值與 switch 陳述式
的第一項測試相符,switch 陳述式的第一個程式碼區塊隨即執行。當 PowerShell
抵達第一個 break 陳述式時,就會結束 switch 陳述式。若將此範例中的四個 break
陳述式全部移除,則會符合所有四個條件。因此,範例使用 break 陳述式以顯示
符合最確切條件的結果。



Power Shell WildCard 萬用字元



多數情況下,您會想要針對一組項目來執行 Cmdlet,而不是只針對單一個別項目。例
如,您可能想要找出 c:\techdocs 目錄下以 .ppt 為副檔名的所有檔案。若您執行
下列命令,將傳回該目錄下的所有項目:

代碼:

        Get-ChildItem c:\techdocs


此命令的問題在於,您必須目視檢查列示於該目錄下的所有文件,以判斷有哪些檔案
使用 .ppt 做為副檔名。不過,若在 Cmdlet 的參數中使用萬用字元,您即可限制傳回
的項目。萬用字元是一種替代符號,可讓您搜尋未知的值而傳回特定結果。使用
萬用字元的處理方式有時稱為 "globbing"。例如,您可改寫上述範例而僅傳回 .ppt
檔案:

代碼:

        Get-ChildItem c:\techdocs\*.ppt


此命令使用 * 萬用字元指定 .ppt 副檔名的前面可為任意字元。由於已經指定
副檔名,命令傳回的所有檔案都必須有此副檔名,但檔案則可為任意名稱。
因此,其結果只會傳回您要找的檔案。

PowerShell 支援下列幾種萬用字元,包含 * 萬用字元在內:

代碼:

    萬用字元 描述               範例     相符              不相符
    -------- ------------------ -------- ----------------- --------
    *        比對零個以上的字元 a*       A, ag, Apple      banana
    ?        只比對指定位置上的 ?n       an, in, on        ran
             單一字元
    [ ]      比對指定範圍內的   [a-l]ook book, cook, look  took
             字元
    [ ]      比對指定的字元     [bc]ook  book, cook        hook


大多數的 Cmdlet 都有若干參數接受萬用字元。每個 Cmdlet 的說明主題會說明有哪
些參數允許萬用字元 (若有的話)。如果參數接受萬用字元,則在使用上不區分
大小寫。例如,?n 將傳回 An、an、In、in、On、on 等等。

您也可以在單一參數中混用多種萬用字元。例如,若要顯示 c:\techdocs 目錄下以字
母 a 到 l 開頭的所有 .txt 檔案,則可使用下列命令:

代碼:

        Get-ChildItem c:\techdocs\[a-l]*.txt


此命令使用範圍萬用字元 ([a-l]) 指定檔名應以字母 a 到 l 為開頭,然後使用 * 萬
用字元表示第一個字母和副檔名之間可為任意字元。



Power Shell "where" 篩選命令


請注意第一個命令 (將 $val 遞增 1) 和第二個命令 (將 $val 的值寫入主控台) 之間
以分號分隔。

在命令管線中使用 where 陳述式可篩選上一個命令所傳回的物件,然後傳回這些物件
的子集。where 陳述式所接受的引數係依物件的屬性指定要套用的篩選條件,以決定
是否沿管線向下傳遞特定物件。

where 陳述式採用下列語法:

代碼:

        cmd1 | where {<測試1 [<連結>
        <測試2>]...}


<測試1> 是解析成布林值 (TRUE/FALSE) 的運算式。

<連結> 是結合 <測試1> 和 <測試2> 的運算子,其套用結果解析成布林值。<連結> 可
以是下列任何運算子:

-and 邏輯 and
-or 邏輯 or
-bor 位元運算 or
-band 位元運算 and
-xor XOR 運算子

<測試2> 是解析成布林值的運算式。

測試運算式可置於括號中,藉以控制運算子優先順序。

特殊變數 $_ 可用於參照接收自管線的物件。例如,$_.Name 會擷取管線中的上一個
命令所傳回物件的 Name 屬性。

where 陳述式支援下列運算子:

運算子 意義
--------------------------------------------------------------------
-eq 相等 (不區分大小寫)
-lt 小於 (不區分大小寫)
-gt 大於 (不區分大小寫)
-le 小於或等於 (不區分大小寫)
-ge 大於或等於 (不區分大小寫)
-ne 不相等 (不區分大小寫)
-not 邏輯 not (別名為 !)
-match 使用規則運算式規則比較字串
-notmatch 使用規則運算式規則比較字串
-like 使用萬用字元規則比較字串
-notlike 使用萬用字元規則比較字串
-replace 取代字串;取代成功將傳回 true
-and 邏輯 and
-or 邏輯 or
-bor 位元運算 OR
-band 位元運算 AND
-xor XOR 運算子
-comp 互補運算子 (~)
-sr 向右移位
-sl 向左移位
-ceq 相等 (區分大小寫)
-clt 小於 (區分大小寫)
-cgt 大於 (區分大小寫)
-cle 小於或等於 (區分大小寫)
-cge 大於或等於 (區分大小寫)
-cne 不相等 (區分大小寫)
-ieq 相等 (不區分大小寫)
-ilt 小於 (不區分大小寫)
-igt 大於 (不區分大小寫)
-ile 小於或等於 (不區分大小寫)
-ige 大於或等於 (不區分大小寫)
-ine 不相等 (不區分大小寫)
-inot 邏輯 not (不區分大小寫)
-imatch 使用規則運算式規則比較字串 (不區分大小寫)
-inotmatch 使用規則運算式規則比較字串 (不區分大小寫)
-ilike 使用萬用字元規則比較字串 (不區分大小寫)
-inotlike 使用萬用字元規則比較字串 (不區分大小寫)

Powershell .Net 型別擴充


PowerShell 主目錄下的 types.ps1xml 檔案,提供用於擴充 .NET 型別系統的機制。
預設情況下,PowerShell 會在該檔案中加入一些元素藉以擴充 .NET 型別。
此外,您也可以加入其他的自訂元素。

擴充型別可行的辦法之一是新增屬性。若要新增屬性 (或以任何方式擴充型別),必須
在 types.ps1xml 檔案中修改特定型別的 <type> 元素。例如,陣列型別預設並沒有
Count 屬性,所以 PowerShell 定義了別名屬性,稱為 Count。這個屬性包含 Length
屬性的參照成員名稱,如下列 XML 所示:

代碼:

       <Type>
           <Name>System.Array</Name>
               <Members>
               <AliasProperty>
                   <Name>Count</Name>
                   <ReferencedMemberName>
                       Length
                   </ReferencedMemberName>
               </AliasProperty>
               </Members>
       </Type>


如需確認自訂的 AliasProperty,您可以使用 Get-Member 命令擷取物件陣列的屬性,
如下列命令所示:

代碼:

       Get-Member -inputobject (1,2,3,4) -member *property*


命令傳回以下結果:

TypeName: System.Object[]

代碼:

       名稱           MemberType    定義
       ----           ----------    ----------
       Count          AliasProperty Count = Length
       IsFixedSize    Property      System.Boolean IsFixedSize {ge
       IsReadOnly     Property      System.Boolean IsReadOnly {get
       IsSynchronized Property      System.Boolean IsSynchronized
       Length         Property      System.Int32 Length {get;}
       LongLength     Property      System.Int64 LongLength {get;}
       Rank           Property      System.Int32 Rank {get;}
       SyncRoot       Property      System.Object SyncRoot {get;}


如您所見,Count 別名屬性列在屬性清單中,其定義為 "Count = Length"。

在 types.ps1xml 檔案中,您也可以定義指令碼屬性,以針對物件的輸入值執行
指令碼。例如,types.ps1xml 檔案中包含下列指令碼區塊,為 .NET DateTime
物件新增 DateTime 成員:

<Type>
<Name>System.DateTime</Name>
<Members>
<ScriptProperty>
<Name>DateTime</Name>
<GetScriptBlock>
if ($this.DisplayHint -ieq "Date")
{
"{0}" -f $this.ToLongDateString()
}
elseif ($this.DisplayHint -ieq "Time")
{
"{0}" -f $this.ToLongT
________________

美術插畫設計案子報價系統 v0.1 Beta
爪哇禾雀
Type



繪圖畫廊設計藝廊
攝影相簿留言板
最愛收藏分類標籤
暱稱: Type
註冊: 2002-11-30
發表: 11072
來自: vovo2000.com
V幣: 900702
Re: PowerShell 語法說明/範例教學 2011-11-16 16:38
/ / /

PowerShell 特殊字元/逸出字元 "`"



抑音符號 (`) 字元是 PowerShell 逸出字元。這個字元的按鍵通常位於 Qwerty 鍵盤
的左上角,與波狀符號 (~) 共用同一個按鍵。` 字元的用途依其用法不同而異。
下列清單說明這個字元運用在 PowerShell 各種不同環境中的意義:

* 位於變數前面時,表示下一個字元應傳遞給呼叫端命令而不得替換。以下範例示範,
若包含在雙引號中的變數名稱前面沒有加上 ` 字元,會產生何種結果:

代碼:

       $a = "Ken Myer"
       Write-Host "Hello, $a"


此命令的輸出為:

代碼:

       Hello, Ken Myer


對照之下,以下範例示範,若包含在雙引號中的變數名稱前面加上 ` 字元,會產生何
種結果:

代碼:

       $a = "Ken Myer"
       Write-Host "Hello, `$a"


此命令的輸出為:

代碼:

       Hello, $a


* 用於指令碼的行尾時 (亦即其後已無其他字元),` 符號是做為接續字元。它將指示
PowerShell 繼續從下一行讀取命令。您可藉此撰寫簡潔且更容易判讀的多行程式碼。
下列指令檔示範,如何使用 ` 字元做為行接續字元:

代碼:

       $a = Get-ChildItem
       foreach ($file in $a){
       Write-Host $file.name $file.CreationTime`
         $file.LastAccessTime $file.LastWriteTime
       }


此範例中的 ` 字元會將 Write-Host 命令接續成一體,所以 $file 變數的四個屬性將
一併顯示於主控台。請注意,若您想要從命令列輸入上述指令碼,而不是將其內容
寫入指令檔,則務必確定命令區塊的左括號與 foreach 陳述式位於同一行,正如範例
所示。

* 用於引號內部時,` 字元表示下一個字元應解譯為特殊字元。例如,`n 代表
「新行」字元,將使 PowerShell 從該字元所在位置起始另一新行;`t 則代表定位
字元,會將下一個字元對齊下一欄的左邊,預設欄寬為八個字元。

PowerShell 能夠辨識下列特殊字元:

`0 Null
`a 警示
`b 退格鍵
`n 新行字元
`r 換行字元
`t 水平定位字元
`' 單引號
`" 雙引號

警示 (`a) 字元會將鈴聲或嗶聲信號傳送到電腦的喇叭上。您可藉此通知使用者,在
執行特定命令或指令碼之後即將某些發生狀況。下列命令會將兩聲嗶聲信號傳送到
本機電腦的喇叭上:

代碼:

        for($i = 0; $i -le 1; $i++){Write-Host `a}


在命令中加上退格鍵 (`b) 字元會將游標往左移一個字元。這和鍵盤上的退格鍵不同,
並不會清除前一個字元。以下範例在 Write-Host 命令寫入單字 "backup" 後隨即
傳送兩個退格鍵信號。

代碼:

        Write-Host "backup`b`bout"


此命令的輸出如下:

代碼:

        backout


新行 (`n) 字元會在 `n 後面插入換行。以下範例示範,如何在 Write-Host 命令中使
用 `n 字元:

代碼:

        Write-Host "Line-0`n Line-1`n Line-2`n"



在命令中加上換行 (`r) 字元相當於按下換行鍵。這和退格鍵字元 (`b) 很像,但會
移除 `r 字元前面的一整行。以下範例示範實際情況:

Write-Host "請靜觀其變`r刪除此處之前的全部內容。"

此命令的輸出為:

刪除此處之前的全部內容。

水平定位 (`t) 字元會在輸出中加入定位點。定位點預設為 8 個空格。以下範例會在
各欄之間加入兩個定位點:

代碼:

    Write-Host "tab1 `t`t tab2 `t`t tab3"



下列特殊字元不是供螢幕輸出使用,而是供印表機輸出執行下列作業:

`f 換頁字元
`v 垂直定位字元


PowerShell 簽署與執行原則


PowerShell 執行原則藉由判斷 PowerShell 載入組態檔與執行指令碼的狀況,為指令
碼執行環境提供安全性。

"Restricted" (受限制) 是最安全的原則,此為預設值。此原則允許執行個別命令,
但不允許執行指令碼。

每當執行原則禁止 PowerShell 載入檔案或執行指令碼時,便會出現警告說明限制。

「載入擴充型別資料檔時發生錯誤:」
「載入格式資料檔時發生錯誤:」

若要載入檔案或允許指令碼執行,請變更執行原則。


變更執行原則
------------------------------
您可以變更電腦上的 PowerShell 執行原則。變更將立即生效並一直保留到下次變更為止。
只有系統管理員才能變更原則。

若要變更執行原則,請輸入:

Set-ExecutionPolicy <原則名稱>

例如,

Set-ExecutionPolicy RemoteSigned

若此命令成功,PowerShell 將顯示命令提示字元, 但不會出現成功訊息。如果命令失敗,
PowerShell 就會顯示錯誤訊息,並回復為原先的執行原則。


若要檢視 PowerShell 執行原則,請輸入:

Get-ExecutionPolicy

若此命令沒有成功,可能是因為您所輸入的原則名稱不正確。請檢查名稱然後再試一次。如
果您沒有執行此命令的權限,請洽詢系統管理員。


POWERSHELL 執行原則
------------------------------

PowerShell 執行原則包括:

Restricted (受限制)
- 預設執行原則。
- 允許執行個別命令,但無法執行指令碼。

AllSigned (全已簽署)

- 可以執行指令碼。
- 所有的指令碼和組態檔都必須有受信任發行者的數位簽章,包括本機電腦上撰寫
的指令碼在內。
- 執行來自受信任發行者的指令碼之前會出現提示。
- 執行已簽署但居心不良的指令碼會有風險。

RemoteSigned (遠端簽署)
- 可以執行指令碼。
- 從網際網路下載的指令碼和組態檔都必須有受信任發行者的數位簽章 (包括由電
子郵件程式和立即訊息程式所下載)。
- 從本機電腦執行的指令碼不需要數位簽章。
- 執行來自受信任發行者的指令碼之前不會出現提示。
- 執行已簽署但居心不良的指令碼會有風險。

Unrestricted (沒有限制)
- 可以執行未經簽署的指令碼。
- 可以執行從網際網路下載的指令碼和組態檔 (包括由 Microsoft Outlook、
Outlook Express 和 Windows Messenger 所下載),但執行之前會出現警告
表示檔案來自網際網路。
- 執行居心不良的指令碼會有風險。


執行未經簽署的指令碼 (REMOTESIGNED 執行原則)
-------------------------------------------------------

如果 PowerShell 執行原則設為 RemoteSigned,PowerShell 就不會執行從網際網路下載而
未經簽署的指令碼 (包括由電子郵件程式和立即訊息程式所下載)。

若您嘗試執行已下載的指令碼,PowerShell 將顯示下列錯誤訊息:

C:\remote.ps1 檔案無法載入。C:\remote.ps1 檔案未經數位簽署。這個指令碼將不
會在系統上執行。如需詳細資訊,請參閱 "Get-Help about_signing"。
在執行指令碼之前,請先檢查其程式碼,確定您信任該指令碼。指令碼的效力等同於任何
的可執行程式。

執行未經簽署的指令碼:

1. 將指令檔儲存至電腦。
2. 按一下 [開始],再按一下 [我的電腦],然後瀏覽到剛才儲存的指令檔。
3. 以滑鼠右鍵按一下指令檔,再按一下 [內容]。
4. 按一下 [解除封鎖]。


從網際網路下載的指令碼若已經過數位簽署,但您尚未信任其發行者,PowerShell 會顯示
下列訊息:

要執行來自這個不受信任發行者的軟體嗎? C:\remote_file.ps1 檔案是由 CN=<發行者
名稱> 所發行。這個發行者在您的系統上並不受信任。只可執行來自受信任發行者
的指令碼。

[V] 永不執行 [D] 不要執行 [R] 執行一次 [A] 永遠執行 [?] 說明 (預設為 "D"):

若您信任該發行者,請選取 [執行一次] 或 [永遠執行]。如果不信任發行者,則選取
[永不執行] 或 [不要執行]。一旦選取 [永不執行] 或 [永遠執行],PowerShell 日後
將不再提示您確認該發行者。

簽署指令碼的方法
-----------------------------------------

您可以簽署自己撰寫的指令碼,也可以簽署來自其他來源的指令碼。簽署任何指令碼之前,
請先檢查當中的每個命令,以確認執行上安全無虞。

如需有關如何簽署指令檔的詳細資訊,請在 PowerShell 命令列輸入:

Get-Help Set-AuthenticodeSignature


若要為指令碼加上數位簽章,您必須使用程式碼簽署憑證簽署指令碼。適合簽署指令檔的
憑證有兩種:

-- 由憑證授權單位建立的憑證:

支付費用後,公眾憑證授權單位會先確認您的身分,再核發程式碼簽署憑證給您。
若向具有公信力的憑證授權單位購得憑證,您就能將指令碼分享給其他 Windows
電腦的使用者,因為他們的電腦會信任該憑證授權單位。

-- 由您自己建立的憑證:

您可以建立「自我簽署憑證」,將您的電腦當成建立憑證的授權單位。這種憑證是
免費的,並可讓您在自己的電腦上撰寫、簽署及執行指令碼,但是其他電腦並不
信任您的電腦,因而可能不允許執行指令碼。

若要建立自我簽署憑證,請確定您的憑證已啟用加強私密金鑰保護。這可防止惡意
程式以您的名義簽署指令碼。如需相關指示,請參閱本主題最後一節。


建立自我簽署憑證
------------------------------------------------------------
您可以使用 MakeCert.exe 工具建立自我簽署憑證,此工具隨附於 Microsoft .NET
ramework SDK (1.1 及以後的版本) 與 Microsoft Platform
DK。

使用 MakeCert 建立憑證:

在 SDK 命令提示字元視窗中,執行下列命令。

第一個命令會為您的電腦建立本機憑證授權單位。第二個命令則透過憑證授權單位產
生個人憑證:

makecert -n "CN=PowerShell Local Certificate Root" -a sha1 `
-eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer `
-ss Root -sr localMachine

makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 `
-eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

MakeCert 將會提示您輸入私密金鑰密碼。


確認已正確產生憑證:

在 PowerShell 命令提示字元輸入:
get-childitem cert:\CurrentUser\My -codesigning

此命令使用 PowerShell 憑證提供者檢視憑證的相關資訊。

若已確實建立憑證,輸出結果將顯示憑證指紋,當中包含 PowerShell 使用者的驗證資
料,顯示畫面大致如下:


目錄: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

指紋 主體
---------- -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF CN=PowerShell User ]


簽署指令碼
-------------

建立自我簽署憑證之後,您就可以簽署指令碼。如果執行原則設為 AllSigned,簽署指令
碼將允許您在自己的電腦上執行指令碼。

下列範例指令碼 sign-file.ps1 用於簽署指令碼。不過,若您使用 AllSigned 執行原則,
就必須先簽署 sign-file.ps1 才能執行該指令檔。

若要使用這個指令碼,請將下列文字複製到文字檔,並將檔案命名為 sign-file.ps1。

(請確定指令檔不是以 .txt 為副檔名。如果文字編輯器自行加上 .txt,請將檔名置於引
號中,例如 "sign-file.ps1")。


## sign-file.ps1
## 簽署檔案
param([string] $file=$(throw "請指定檔名。"))
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature $file $cert


若要簽署 sign-file.ps1,請在 PowerShell 命令提示字元輸入:

$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]

Set-AuthenticodeSignature sign-file.ps1 $cert


簽署指令碼之後,您就可以在本機電腦上執行已簽署的指令碼。不過,其他電腦若將
PowerShell 執行原則設為必須有來自受信任授權單位的數位簽章,則這些電腦將無法執行
該指令碼。如果您試圖執行,PowerShell 會回報下列錯誤:

C:\remote_file.ps1 檔案無法載入。憑證的簽章無法驗證。
位於 行:1 字元:15

+ .\ remote_file.ps1 <<<<

如果您執行了別人所撰寫的指令碼以致 PowerShell 顯示上述訊息,則可將該檔案視同任何
未經簽署的指令碼比照辦理。請檢查其程式碼,若決定信任即可加以簽署然後執行。

為憑證啟用加強私密金鑰保護
---------------------------------------------------------

如果您的電腦上有私人憑證,惡意程式或許就能夠以您的名義簽署指令碼,進而授權
PowerShell 執行這些指令碼。

若要防止程式以您的名義自動簽署,請使用憑證管理員工具 (Certmgr.exe) 將簽署憑證匯
出為 .pfx 檔案。憑證管理員隨附於 Microsoft .NET Framework SDK、
Microsoft Platform SDK 與 Internet Explorer 5.0 及以後的版本。

匯出憑證:

1. 啟動憑證管理員 (此為 GUI 工具)。

2. 選取由 "PowerShell Local Certificate Root" 所核發的憑證。

3. 按一下 [匯出] 以啟動 [憑證匯出精靈]。

4. 選取 [是,匯出私密金鑰] 然後按一下 [下一步]。

5. 選取 [啟用加強保護]。

6. 輸入密碼,再輸入相同密碼進行確認。

7. 以 .pfx 為副檔名輸入檔案名稱。

8. 按一下 [完成]。


重新匯入憑證:

1. 啟動憑證管理員 (此為 GUI 工具)。

2. 按一下 [匯入] 以啟動 [憑證匯入精靈]。

3. 瀏覽到執行匯出程序時建立的 .pfx 檔案所在位置。

4. 在 [密碼] 頁面上選取 [啟用加強私密金鑰保護],然後輸入匯出過程中
指定的密碼。

5. 選取 [個人] 憑證存放區。

6. 按一下 [完成]。

PowerShell 程式區塊



以下是指令碼區塊的幾個例子:

此範例利用迴圈找出副檔名為 *.txt 的每個檔案,然後將檔案的完整名稱和長度寫入
主控台。

代碼:

       foreach ($file in Get-ChildItem c:\techdocs\*.txt)
       {
           Write-Host $file.fullname $file.length
       }


此範例將 if 陳述式放在 foreach 迴圈內以形成巢狀結構。

代碼:

       foreach ($file in Get-ChildItem c:\techdocs\*.txt)
       {
           if ($file.length -ge 100)
           {
               Write-Host $file.name - $file.length 個位元組
           }
           else
           {
               Write-Host $file.name - "檔案小於 100 個位元組。"
           }
       }



將指令碼區塊指定給變數
您可以將指令碼區塊指定給變數,如下所示:

代碼:

       $a = {Write-Host $file.fullname $file.length}


使用 & 即可執行指令碼區塊變數,如下所示:

代碼:

       foreach ($file in Get-ChildItem c:\techdocs\*.txt) {&$a}

       Write-Host $file.fullname $file.length



函數和篩選器

代碼:

       function text_files
       {
           Get-ChildItem c:\techdocs\*.txt
       }



PowerShell 函數與變數範圍


PowerShell 基於控制變數與函數的可存取性,會限制這兩種元素的可用範疇。此限制
稱為範圍,且 Windows PowerShell 將強制幾個範圍設定規則,以免您不小心更動到
已在其他地方建立的變數或函數。

範圍的基本規則如下:若您沒有明確要求,就只能在變數建立之處的範圍內讀取或變更
變數 且若要在其他範圍內讀取變數,則該範圍必須是建立在變數或函數建立之處的
範圍內。Windows PowerShell 初次啟動時的範圍是全域範圍。每當您執行指令碼、
呼叫函數或啟動新的 Windows PowerShell 執行個體,便會建立一個新範圍。子範圍
(建立在另一範圍內的範圍) 可以讀取父系範圍內所建立的變數,但除非明確指出
範圍的名稱,否則無法變更父系範圍內的變數,。

例如,$home 變數的初始設定是 $env:HOMEDRIVE + $env:HOMEPATH。
由於這是該變數在 Windows PowerShell 啟動時的初始值 (依 profile.ps1 檔案中的
設定),因此此值隸屬於全域範圍。接著您可以建立並執行下列指令碼:

"`$home 的初始值為 $home"
$home="c:\"
"`$home 的新值為 $home"

執行上述指令碼將顯示下列資訊:

$home 的初始值為 C:\Documents and Settings\JoeUser
$home 的新值為 c:\

但是,若您結束指令碼,然後在命令列輸入 $home,便會顯示下列資訊:

C:\Documents and Settings\JoeUser

這是因為當指令碼指定新值給 $home 變數時,會在指令碼的範圍內建立新變數,且指
定變數值的動作是變更新變數而非全域變數。在指令碼內對該變數進行任何的後續
參照,都將參照區域變數,而非父系範圍內的變數。一旦結束指令碼,$home 就不
再參照指令碼所建立的變數,而是參照全域變數。如前所述,參照變數時若明確就
可以變更父系範圍變數的值。Windows PowerShell 提供三種變數範圍識別標籤:
區域 (local)、全域 (global) 和指令碼 (script)。

區域範圍始終都是目前的範圍。每當您執行函數或指令碼,或是啟動新的 Windows
PowerShell 執行個體,便會建立一個新的區域範圍。您可以在區域範圍內讀取或變更
該範圍內定義的變數,但在其子範圍內只能讀取而無法變更這些變數。父系範圍既
無法讀取也不能變更其子範圍內所定義的變數。

全域範圍是在 Windows PowerShell 啟動時建立的範圍。子範圍只能變更全域範圍內
已將變數名稱明確標示為 global 的變數,但任何子範圍皆可讀取全域變數 (即使
沒有加上 global 標籤),除非子範圍使用了相同的變數名稱 (就像本主題稍早的範例
那樣)。

指令碼範圍是在指令碼執行時建立的範圍,一旦指令碼結束就不復存在。例如,撰寫
指令碼時若在函數內部使用 script 標籤,您即可存取指令碼在函數外面建立的變數。

若要參照其他範圍內的變數 (或確保變數參照隸屬於適當範圍),請在變數名稱前面加
上範圍標籤,兩者之間以冒號 (:) 分隔。下列指令碼示範如何只用範圍標籤,就能

$var = "init"
function changevar {
'在函數中 $var 的初始設定是 "'+$var+'"'
$var = "function"
'在函數中 $var 如今已設定為 "'+$var+'"'
$script:var = "script"
'在函數中 $var 目前仍設定為 "'+$var+'";'
'但在指令碼範圍內,$var 如今已設定為 "'+$script:var+'"'
}
changevar
'在指令碼中 $var 如今已設定為 "'+$var+'"'

執行上述指令碼將產生以下結果:

在函數中 $var 的初始設定是 "init"
在函數中 $var 如今已設定為 "function"
在函數中 $var 目前仍設定為 "function";但在指令碼範圍內,$var 如今已設定為
"script"
在指令碼中 $var 如今已設定為 "script"

指令碼起初呼叫 changevar 函數時,$var 的設定值是指令碼在函數定義前面所設定的
值。當函數指定新值給 $var 時,在函數的範圍內就會建立一個新變數。函數只要在
參照 $var 時明確指出指令碼範圍的名稱,即可變更 $var 的值而不會影響到建立於
指令碼範圍內的 $var 變數。單僅使用 global 標籤,指令碼就能指定全域變數的值,
或將函數的可用性改為全域性,如以下範例所示:

代碼:

    $global:home = "c:\user\home"
    function global:prompt {(Get-Location).path + '>'}


變數若標示為 private (私用),就表示不能在目前的區域範圍外使用該變數。

代碼:

        $variable = 3
        function a
        {
            $variable
            $private:variable = "__"
            $variable
            b
        }
       
        function b
        {
            $variable
        }
        $variable
        a
        $variable


執行上述指令碼會輸出以下結果:

代碼:
   
        3
        3
        __
        3
        3


函數 'a' 中所使用的 private 標籤意味著 $variable 只有在函數 'a' 中才會設定為
「__」。如果沒有 private 標籤,輸出結果會變成這樣:

3
3
__
__
3

如今函數 'a' 會為函數 'b' 中的 $variable 設定新值。

和變數一樣,函數及篩選器定義也受制於範圍界限。這可確保函數及篩選器定義指令
碼不致於取代父系範圍內的同名函數,除非定義中明確使用 global 關鍵字。您也
可以使用 local、script 和 private 標籤來控制函數及篩選器的範圍。如需有關建立
函數的詳細資訊,請輸入 Get-Help about_Function。

除了使用 global 標籤從指令碼指定全域範圍的變數值,或是定義函數或篩選器之外,
您也能用所謂「句號標記來源」(Dot Source) 指令碼的方式執行指令碼。也就是說,
若在指令碼名稱前面加上一個句號再空一格,其效果就如同在命令提示字元逐行
輸入指令碼一樣,因此 Windows PowerShell 將會執行指令碼。這樣一來,指令碼
所做的變更就會在全域範圍生效,而非僅限於指令碼範圍。

PowerShell 環境變數



環境變數儲存著作業系統環境的相關資訊。這些資訊包括作業系統路徑、作業系統使
用的處理器數目,以及暫存資料夾的位置等詳細資料。

環境變數所儲存的資料可供作業系統及其他程式使用。例如,"windir" 環境變數包含
了 Windows 安裝目錄的位置。程式只要查詢此變數的值,即可得知 Windows 作業
系統檔案所在位置。


WINDOWS POWERSHELL ENVIRONMENT 提供者
Windows PowerShell 環境提供者讓您可在 Windows PowerShell 中,從看似檔案系統
磁碟機的 Windows PowerShell 磁碟機 Env: 存取 Windows 環境變數。

例如,若要切換到 Windows PowerShell Env: 磁碟機,請輸入:

set-location env:

接著,若要顯示 Windows PowerShell Env: 磁碟機的內容,請輸入:

get-childitem

您可以從任何其他 Windows PowerShell 磁碟機切換到 Windows PowerShell Env: 磁
碟機來檢視環境變數,也可以進入 Windows PowerShell Env: 磁碟機來檢視和變更
環境變數。


環境變數物件
在 Windows PowerShell 中,每個環境變數都是以物件表示,也就是
System.Collections.DictionaryEntry 類別的執行個體。

每個 DictionaryEntry 物件中的字典索引鍵即是環境變數的名稱,而字典值則是變數
的值。

若要在 Windows PowerShell 中顯示環境變數,請先取得代表變數的物件,然後顯示物
件屬性的值。使用與 DictionaryEntry 物件關聯的各種方法即可在 Windows
PowerShell 中變更環境變數。

若要在 Windows PowerShell 中顯示代表環境變數之物件的屬性和方法,請使用
Get-Member cmdlet。例如,若要顯示 Windows PowerShell Env: 磁碟機上所有
物件的方法和屬性,請輸入:

get-item -path env:* | get-member


顯示環境變數
您可以使用 Windows PowerShell 項目 cmdlet (*-Item) 顯示及變更環境變數的值。
由於環境變數沒有子項目,Get-Item 和 Get-Childitem 會產生相同的輸出。

參照環境變數時,請輸入 "Env:" 磁碟機名稱再加上變數的名稱。例如,若要顯示
COMPUTERNAME 環境變數的值,請輸入:

代碼:
   
       get-childitem env:computername


若要顯示所有環境變數的值,請輸入:

代碼:

        get-childitem env:


根據預設,Windows PowerShell 會依擷取的順序顯示環境變數。若要讓環境變數的清
單依變數名稱排序,請將 Get-Childitem 命令的輸出傳送給 Sort-Object cmdlet。
例如,您可從任何 Windows PowerShell 磁碟機輸入:

代碼:

        get-childitem env: | sort name



您也可以使用 Set-Location cmdlet 進入 Windows PowerShell Env: 磁碟機。

代碼:

        set-location env:


一旦您已位於 Windows PowerShell Env: 磁碟機,路徑即可省略 "Env:" 磁碟機
名稱。例如,若要顯示所有的環境變數,請輸入:

代碼:

        get-childitem


若要從 Windows PowerShell Env: 磁碟機內部顯示 COMPUTERNAME 變數的值,
請輸入:

代碼:

        get-childitem computername


您也可以不使用 cmdlet,而改用 Windows PowerShell 運算式剖析器顯示及變更環境
變數的值。若要顯示環境變數的值,請使用下列語法:

代碼:

         $env:<變數名稱>


例如,若要顯示 Windir 環境變數的值,請在 Windows PowerShell 命令提示字元
輸入:

代碼:

         $env:windir


在這個語法中,貨幣符號 ($) 表示變數,磁碟機名稱 "env:" 則表示環境變數。

變更環境變數

在 Windows PowerShell 中變更環境變數時,所做的變更只會影響目前工作階段,就如
同使用 Windows 的 Set 命令或是 Unix 的 Setenv 命令。為使變更永久生效,變更
作業必須在登錄中進行。

您也必須擁有變更變數值的權限。若您沒有足夠的權限而試圖變更值,命令就會失敗
且 Windows PowerShell 將顯示錯誤。

您可以不使用 cmdlet,而改用下列語法變更變數的值:

代碼:

        $env:<變數名稱> = "<新值>"


例如,若要將 ";c:\temp" 附加到 Path 環境變數的值後面,請使用下列語法:

代碼:

        $env:path = $env:path + ";c:\temp"   


您也可以使用項目 cmdlet 如 Set-Item、Remove-Item 和 Copy-Item 變更環境變數的
值。例如,若要使用 Set-Item cmdlet 將 ";c:\temp" 附加到 Path 環境變數的
值後面,請使用下列語法:

代碼:

      set-item -path env:path -value ($env:path + ";c:\temp")


在此命令中,新值置於括號中,所以會解譯為一個單位。



PowerShell Regular Expression



PowerShell 支援下列規則運算式字元:

代碼:

        格式     邏輯                             範例
        -------- -------------------------------- -----------------------
        值       與原始值任何一處的若干字元       "book" -match "oo"
                 完全相符
        .        任何單一字元相符                 "copy" -match "c..y"
        [值]     至少與括號中的某個字元相符       "big" -match "b[iou]g"
        [範圍]   至少與範圍內的某個字元相符。     "and" -match "[a-e]nd"
                 可使用連字號 (-) 表示連續
                 字元
        [^]      與不在括號中的任何字元相符       "and" -match "[^brt]nd"
        ^        與?#125;頭的字元相符                 "book" -match "^bo"
        $        與結尾的字元相符                 "book" -match "ok$"
        *        與前一個字元的零個或更多例項相符 "baggy" -match "g*"
        ?        與前一個字元的零個或一個例項相符 "baggy" -match "g?"
        \        與逸出字元的下一個字元相符       "Try$" -match "Try\$"


PowerShell 支援 .NET 規則運算式可用的字元類別

代碼:
   
        格式     邏輯                            範例
        -------- ------------------------------- -----------------------
        \p{name} 與 {name} 所指定之具名字元類別  "abcd defg" -match "\p{Ll}+"
                 中的任何字元相符。支援的名稱?#93;
                 括 Unicode 群組和區塊範圍。
                 例如 Ll、Nd、Z、IsGreek、
                 IsBoxDrawing。
        \P{name} 與未?#93;含在 {name} 所指定之群組  1234 -match "\P{Ll}+"
                 及區塊範圍內的文字相符
        \w       與任何文字字元相符。相當於      "abcd defg" -match "\w+"
                 Unicode 字元類別 [\p{Ll}\p{Lu}  (此例與 abcd 相符)
                 \p{Lt}\p{Lo}\p{Nd}\p{Pc}]。
                 若使用 ECMAScript 選項
                 指定 ECMAScript 相容行為,
                 則 \w 相當於 [a-zA-Z_0-9]。
        \W       與任何非文字字元相符。相當於     "abcd defg" -match "\W+"
                 Unicode 類別 [^\p{Ll}            (此例與空格相符)
                 \p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]
        \s       與任何空白字元相符。相當於       "abcd defg" -match "\s+"
                 Unicode 字元類別
                 [\f\n\r\t\v\x85\p{Z}]
        \S       與任何非空白字元相符。相當於    "abcd defg" -match "\S+"
                 Unicode 字元類別
                 [^\f\n\r\t\v\x85\p{Z}]
        \d       與任何十進位數字相符。相當於     12345 -match "\d+"
                 Unicode 的 \p{Nd} 以及非
                 Unicode 的 [0-9]
        \D       與任何非數字相符。相當於         "abcd" -match "\D+"
                 Unicode 的 \P{Nd} 以及非
                 Unicode 的 [^0-9]



PowerShell 支援 .NET 規則運算式可用的數量詞,以下是幾個常見的數量詞範例

代碼:

       格式     邏輯                            範例
       -------- ------------------------------- -----------------------
       *        指定零次或多次相符;例如 \w*    "abc" -match "\w*"
                或 (abc)*。相當於 {0,}
       +        與前幾個字元的重複例項相符      "xyxyxy" -match "xy+"
       ?        指定零次或一次相符;例如 \w?    "abc" -match "\w?"
                或 (abc)?。相當於 {0,1}
       {n}      指定恰好 n 次相符;             "abc" -match "\w{2}"
                例如 (pizza){2}
       {n,}     指定至少 n 次相符;             "abc" -match "\w{2,}"
                例如 (abc){2,}
       {n,m}    指定至少 n 次,但不             "abc" -match "\w{2,3}"
                超過 m 次相符


上表中顯示的所有比對範例均評估為 true。

請注意,規則運算式的逸出字元與 PowerShell 的逸出字元並不相同。規則運算式的
逸出字元是反斜線 "\"。


PowerShell Call-by-Reference



您可以使用參照變數型別,讓方法能夠變更傳給它的變數值。

物件若與 "[ref]" 型別相關聯,便會傳回該物件的參照。將參照運用在方法時,方法
則可參照傳給它的物件。如果物件在方法中發生變更,當控制權交還給呼叫端方法
時,這些變更將轉化為變數值的變更。

若要使用參照,則參數必須是參照變數。如果不是,就會發生 InvalidArgument 例外
狀況。

方法呼叫中的參數必須符合方法所要求的型別。

範例:

代碼:

   PS> function swap([ref]$a,[ref]$b)
   >> {
   >>     $a.value,$b.value = $b.value,$a.value
   >> }

   PS> $a = 1
   PS> $b = 10
   PS> $a,$b
   1
   10
   PS> swap ([ref]$a) ([ref]$b)
   PS> $a,$b
   10
   1

   PS C:\ps-test> function double
   >> {
   >>     param ([ref]$x) $x.value = $x.value * 2
   >> }

   PS C:> $number = 8
   PS C:> $number
   8
   PS C> double ([ref]$number)
   PS C> $number
   16


變數必須是參照變數。

PS C:\ps-test> double $number
double : 引數中必須是參照型別。
位於第 1 行,第 7 個字元
+ double <<<< $number

PowerShell 結果輸出導向



根據預設,PowerShell 會將命令輸出導向到 PowerShell 顯示畫面。但是,您可以覆
蓋這種預設行為,將輸出導向到文字檔以擷取結果供日後使用。

若要將命令的結果寫入文字檔,您必須在命令結尾加上大於 (>) 符號和檔案名稱。例
如,下列命令會將 Get-ChildItem 命令的結果寫入文字檔:

代碼:

       Get-ChildItem c:\windows\system > c:\techdocs\results.txt


當您執行此命令時,輸出將隨即傳送到 c:\techdocs 目錄下的 results.txt 檔案,而
畫面上則不會顯示輸出。如果指定的檔案不存在,就會先建立檔案然後將輸出寫入
該檔案。如果檔案已存在,輸出將以新內容取代檔案中任何既有的內容。

若您不想取代既有輸出檔的內容,則可使用兩個大於 (>>) 符號將輸出附加至既有內
容,如以下範例所示:

代碼:

       Get-ChildItem c:\windows\system >> c:\techdocs\results.txt


此命令會將新的輸出附加到任何既有的內容後面,所以不會刪除既有的內容。


PowerShell 提供者


Windows PowerShell 提供者是 .NET 程式,會將特殊資料存放區內的資料提供給
Windows PowerShell 環境使用,因此您可以輕易地檢視和管理這些資料。

提供者所公開的資料將呈現於磁碟機上,就像硬碟一樣。您可以使用提供者支援的任
何內建 cmdlet 來管理提供者磁碟機上的資料,也可以自訂專為操控資料而特別設計的
cmdlet。

提供者也能為內建 cmdlet 加入「動態參數」。這些參數僅供 cmdlet 用於處理提供
者資料。


內建提供者
Windows PowerShell 隨附一組內建提供者,可用於存取下列幾種不同的資料存放區:

提供者 資料存放區
----------------- ------------------------------------------
Alias Windows PowerShell 別名
Certificate 數位簽章所使用的 X509 憑證
Environment Windows 環境變數
FileSystem 檔案系統磁碟機、目錄和檔案
Function Windows PowerShell 函數
Registry Windows 登錄
Variable Windows PowerShell 變數

您也可以自行建立 Windows PowerShell 提供者,或安裝由他人所開發的提供者。若
要列出 Windows PowerShell 工作階段可用的提供者清單,請輸入
"Get-PsProvider"。


安裝及移除提供者
Windows PowerShell 提供者會傳遞到 Windows PowerShell 嵌入式管理單元,後者則
是編譯成 DLL 檔案的 .NET 程式。嵌入式管理單元可包含提供者和 cmdlet。

若要使用提供者的功能,您必須先安裝嵌入式管理單元並將其新增至 Windows
PowerShell 主控台。如需相關指示,請參閱 About_PsSnapins。

您無法解除安裝提供者,只能從目前主控台移除提供者的 Windows PowerShell 嵌入式
管理單元。進行移除後,將會移除嵌入式管理單元的全部內容,包括 cmdlet 在內。

若要從目前主控台移除提供者,請使用 Remove-PsSnapin cmdlet。這個 cmdlet 並不
會卸載或解除安裝提供者,只不過您已無法在主控台上使用該提供者。

您也可以使用 Remove-PsDrive cmdlet 從目前主控台移除任何磁碟機。磁碟機上的資
料將不受影響,但目前主控台工作階段已無法使用該磁碟機。


檢視提供者
若要找出系統上的 Windows PowerShell 提供者,請輸入:
Get-PsProvider

顯示畫面上會列出內建提供者,還有您已新增至主控台的提供者。

代碼:

        名稱                 功能                             磁碟機
        ----                 ------------                     ------
        Alias                ShouldProcess                    {Alias}
        Environment          ShouldProcess                    {Env}
        FileSystem           Filter、ShouldProcess            {C、D、Z}
        Function             ShouldProcess                    {Function}
        Registry             ShouldProcess                    {HKLM、HKCU}
        Variable             ShouldProcess                    {Variable}
        Certificate          ShouldProcess                    {cert}



檢視提供者資料
提供者的主要優點在於,以使用者熟悉且一致的方式公開資料。用於呈現資料的模型
是檔案系統磁碟機。

您可以檢視、瀏覽和修改提供者所公開的資料,就像使用硬碟上的資料一樣。因此若
要使用提供者,您務必知道提供者支援的磁碟機名稱。

磁碟機會列示在 Get-PsProvider 的預設畫面上,但您亦可使用 Get-PsDrive cmdlet
取得提供者磁碟機的相關資訊。例如,若要找出 Function 磁碟機的所有屬性,
請輸入:

get-psdrive Function | format-list *

您可以比照使用檔案系統磁碟機的方式,檢視和瀏覽提供者磁碟機上的資料。

若要檢視提供者磁碟機的內容,請使用 Get-Item 或 Get-Childitem cmdlet。先輸入
磁碟機名稱再加上冒號 (:)。例如,若要檢視 Alias 磁碟機的內容,請輸入:

get-item alias:

在路徑中加入磁碟機名稱後,即可從其他磁碟機來檢視和管理任何磁碟機上的資料。例
如,若要從其他磁碟機來檢視 HKLM: 磁碟機上的 HKLM\Software 登錄機碼,請輸入:

get-childitem hklm:\software

如需切換磁碟機,請使用 Set-Location cmdlet。指定磁碟機路徑時記得加上冒號。例
如,若要將您的位置變更為 Cert: 磁碟機的根目錄,請輸入:

代碼:

        set-location cert:


接著輸入下列命令即可檢視 Cert: 磁碟機的內容:

代碼:

        get-childitem


再次提醒您,磁碟機名稱記得加上冒號 (:)。

瀏覽階層式資料
您可以比照使用硬碟的方式來瀏覽提供者磁碟機。如果資料排列方式為項目中包含項
目的階層,請使用反斜線 (\) 表示子項目。格式如下:

磁碟機:\位置\下層位置\...

例如,若要將您的位置變更為 cert:\CurrentUser 憑證存放區,請使用
Set-Location 命令,像這樣:

代碼:

        set-location cert:\CurrentUser


您也可以使用相對位置參照。句號 (.) 代表目前位置。例如,如果目前位置為
HKLM:\Software\Microsoft 登錄機碼,而您想要列出
HKLM:\Software\Micrsoft\PowerShell 機碼的子機碼清單,請使用下列命令:

代碼:

        get-childitem .\PowerShell



尋找動態參數
動態參數是為 cmdlet 參數,只有提供者磁碟機上的 cmdlet 方可使用。這些參數為
cmdlet 增添極具價值的功能。

例如,當 Get-Item 和 Get-Childitem 用於處理來自 Cert: 磁碟機的資料時,就會加
入 CodeSigningCert 參數。

如需提供者支援的動態參數清單,請參閱提供者的 "About" 檔案。


PowerShell 物件屬性


PowerShell 使用所謂「物件」的結構化資訊集合,來表示資料存放區中的項目或是
電腦的狀態。例如,當您在 PowerShell 中存取檔案時,處理的對象並非實際檔案
而是 FileInfo 物件,這種物件係做為檔案的 Proxy。

大多數的物件都有一組關聯的屬性。屬性是與物件相關聯的資料,指定了物件的特定
狀態。也就是說,每個屬性描述了物件的某特定層面。例如,FileInfo 物件包含
Length 屬性,以描述此物件所代表之檔案的大小。

如需檢視特定物件的關聯屬性清單,您可以使用 Get-Member Cmdlet。不過,使用這
個 Cmdlet 的前提是物件必須既已存在,可能是由變數來代表的形式,或是沿管線
向下傳遞的物件。例如,假設您已指定字串值給 $a 變數,即表示該變數與字串
物件相關聯。若要檢視此物件的屬性清單,請在 PowerShell 命令提示字元輸入
下列命令:

代碼:

        Get-Member -inputobject $a -membertype property


如果您想查看沿管線向下傳遞的物件相關屬性,請在管線中使用 Get-Member 命令,如
以下範例所示:

代碼:

        Get-ChildItem c:\final.txt | Get-Member -membertype property


請注意 final.txt 檔案必須位於 C: 磁碟機的根目錄,否則此範例將無法運作。

PowerShell 物件也可以包含所謂的附註屬性,這種特殊屬性係承襲自 PowerShell 環
境。附註屬性提供了一般屬性所沒有的其他物件相關資訊。例如,PsIsContainer
附註屬性指出項目是否為容器。

若要檢視特定物件的附註屬性清單,請將 NoteProperty 值做為引數指定給
-MemberType 參數,如以下範例所示:

代碼:
       
        Get-ChildItem c:\final.txt | Get-Member -membertype NoteProperty


存取物件屬性最常用的方式是在物件參照 (例如變數或運算式) 後面指定參數名稱。物
件參照和屬性之間必須以句號分隔。

例如,下列命令顯示 final.txt 檔案的大小 (位元組):

代碼:

        (Get-ChildItem c:\techdocs\final.txt).length


Get-ChildItem 命令會傳回與 final.txt 檔案相關聯的 FileInfo 物件。這種物件包
含 length 屬性,因此您可以透過該屬性存取檔案的大小。

您也可以透過與變數相關聯的物件來存取屬性,如以下範例所示:

代碼:

        $a = (Get-ChildItem c:\techdocs\final.txt)
        Write-Host $a.fullname $a.length $a.lastwritetime


第一行程式碼建立並宣告 $a 變數,作法是將此變數的值設定為 Get-ChildItem
Cmdlet 處理 c:\techdocs 目錄下的 final.txt 檔案後所傳回的結果。第二行程式碼
則傳回與此物件相關聯的三個屬性的值。FullName 屬性傳回檔案的完整路徑
名稱。Length 屬性傳回檔案的位元組大小。LastWriteTime 屬性傳回檔案
更新的日期和時間。如您所見,重複使用變數可以存取物件的各種屬性。

PowerShell PipeLine 命令管線


PowerShell 允許您將兩個以上的命令組合成單一自訂命令,而建立所謂的管線作業。
在管線中鏈結命令後,命令之間彼此傳遞的資料即為物件。第一個命令會將傳回
的一或多個物件沿管線向下傳遞給第二個命令。第二個命令會先處理這些物件,
再將新物件或修改後的物件傳遞給第三個命令。這種情形將持續發生,直到管線
中的每個命令都已執行完成。

若要鏈結命令以組合成單一管線,請依命令的執行順序指定每個命令。命令之間必須
以管線符號 (|) 分隔,也就是垂直線。命令的執行順序為由左至右,以單次作業方式
沿管線向下傳遞所需的物件。

以下範例示範如何將命令組合成單一管線:

代碼:

        Get-ChildItem *.txt | where {$_.length -gt 100} |
        Format-Table name, length


第一個命令 (Get-ChildItem *.txt) 從目前工作位置擷取所有的文字檔。此命令將每
個檔案的相關資料以物件型式傳遞給第二個命令 (where {$_.length -gt 100})。
第二個命令則擷取這些物件,然後依據 length 屬性來篩選物件。接著此命令會將
length 值大於 100 位元組的每個物件,沿管線向下傳遞給第三個命令
(Format-Table name)。第三個命令收到這些物件後,將以表格格式顯示檔案
的名稱。

請注意在第二個命令中,length 屬性前面加上了 $_ 變數。這個變數是由
PowerShell 自動建立,用於儲存目前的管線物件。依此推論,您可以使用這個
變數呼叫管線物件的屬性 (變數名稱和屬性名稱之間必須以句號分隔)。

為了能在管線中鏈結命令,接收端 Cmdlet 的相應參數必須能夠接受管線輸入。如需
判斷參數是否接受管線輸入,您可以使用 Get-Help 命令擷取特定 Cmdlet 的相關
資訊。

藉由此命令所傳回的資訊,即可判斷相應的參數是否接受管線輸入。接受管線輸入的
參數其 "Accepts pipeline input?" 設定必須顯示為 True 值。以
Where-Object Cmdlet 為例,接受管線輸入的相應參數為 ScriptToApply。

如果相應參數不接受管線輸入,您就必須改採其他對策以達到所想要的結果。通常最
好的辨法是將命令寫成指令碼,並使用參數在命令之間傳遞資料。例如,您可以將
上述的 Get-ChildItem 範例改寫成 foreach 迴圈,如下列指令碼所示:

代碼:

        $a = Get-ChildItem *.txt
        foreach ($file in $a)
        {
            if ($file.length -gt 100)
            {
                Write-Host $file.name
            }
        }


此範例將 Get-ChildItem 命令傳回的結果儲存至 $a 變數,接著在 foreach 迴圈中使
用該變數反覆檢查檔案資訊。如您所見,像 foreach 這類流程控制陳述式正適合用
來存取不便透過管線傳遞的資訊。所幸 Where-Object Cmdlet 和 Format-Table
Cmdlet 都支援接受管線輸入的參數,因而使用參數在命令之間傳遞資料是最
簡單的方式。

PowerShell 路徑語法


透過 PowerShell 提供者可進行存取的資料存放區內所有的項目皆可由路徑名稱加以唯
一識別。路徑名稱的組成包含項目名稱、項目所在位置的容器和子容器,以及用於
存取容器的 PowerShell 磁碟機。

在 PowerShell 中,路徑名稱分為兩種類型:完整和相對。完整路徑名稱是由構成路
徑的所有元素組成。下列語法顯示了完整路徑名稱中的元素:

[<提供者>::]<磁碟機>:[\<容器>[\<子容器>...]]\<項目>

<提供者> 預留位置是指用於存取資料存放區的 PowerShell 提供者。例如,
FileSystem 提供者可用於存取電腦上的檔案和目錄。這個語法元素為選擇性,
且其實根本不必指定,因為所有提供者的磁碟機名稱絕不會重複。

<磁碟機> 預留位置是指特定的 PowerShell 提供者支援的 PowerShell 磁碟機。以
PowerShell FileSystem 提供者為例,PowerShell 磁碟機對應到系統上所設定的
Windows 磁碟機。例如,假設您的系統有 A 磁碟機和 C 磁碟機,FileSystem
提供者就會在 PowerShell 中建立相同的磁碟機。

指定磁碟機之後,您必須指定任何含有項目的容器和子容器。容器必須依其現存於資
料存放區內的階層順序來指定。也就是說,您必須先指定父容器,再指定該父容器
中的子容器,依此類推。此外,每個容器前面必須加上反斜線 (附註:為與其他的
PowerShell 能夠相容,PowerShell 允許使用正斜線)。

指定容器和子容器之後,您還必須提供項目名稱,且名稱前面加上反斜線。例如,位
於 c:\windows\system32 目錄下的 shell.dll 檔案,其完整路徑名稱如下:

代碼:

        c:\windows\system32\shell.dll


在此情況下將透過 C 磁碟機存取容器,且最父容器是 Windows,子容器是
System32 (位於 Windows 容器中),而項目則是 shell.dll。

有時候您不需要指定完整路徑名稱,而可改用相對路徑名稱。相對路徑名稱是以目前
工作位置為基準。PowerShell 允許您以項目相對於目前工作位置的位置來指定
項目。指定相對路徑名稱時可以使用特殊字元。下表說明這些特殊字元,並提供
相對路徑名稱和完整路徑名稱的範例。這份表格將以目前工作位置設定為
c:\windows 的情況為例。

符號 描述 相對路徑 完整路徑
------ -------------------------- ---------------- --------------------
代碼:
   
    .      目前工作位置               .\system         c:\windows\system
    ..     目前工作位置的上一層       ..\program files c:\program files
    \      目前工作位置的磁碟機根目錄 \program files   c:\program files
    [無] 沒有特殊字元                 system           c:\windows\system


在命令中使用路徑名稱時,不論是使用完整路徑名稱或相對路徑名稱,輸入名稱的方式
都一樣。例如,假設您的目前工作目錄是 c:\windows。下列 Get-ChildItem 命令會
擷取 c:\techdocs 目錄下的所有項目:

代碼:

        Get-ChildItem \techdocs


反斜線表示應該使用目前工作位置的磁碟機根目錄。由於工作目錄是 c:\windows,磁
碟機根目錄就是 C。正因 techdocs 目錄位於根目錄,您只需要指定反斜線即可。

使用下列命令也能達到同樣的結果:

Get-ChildItem c:\techdocs

無論使用完整路徑名稱或相對路徑名稱,路徑名稱都很重要,因為這項資訊不僅識別
項目的位置,更能唯一識別項目而與位於其他容器中的同名項目做區隔。例如,假設
您有兩個名稱同為 results.txt 的檔案,其中一個檔案位於 c:\techdocs\jan 目錄,
另一個檔案位於 c:\techdocs\feb 目錄。
藉由第一個檔案的路徑名稱
(c:\techdocs\jan\results.txt)
和第二個檔案的路徑名稱
(c:\techdocs\feb\results.txt),
您就能清楚分辨這兩個檔案。




PowerShell 物件方法(method)語法


PowerShell 使用所謂「物件」的結構化資訊集合,來表示資料存放區中的項目或是
電腦的狀態。例如,當您在 PowerShell 中存取檔案時,處理的對象並非實際檔案而
是 FileInfo 物件,這種物件係做為檔案的 Proxy。

大多數的物件都包含方法。方法是一組指令,指定了可透過物件來執行的特定動作。例
如,FileInfo 物件所包含的 CopyTo 方法即可用於複製此物件所代表的檔案。

如需檢視特定物件的方法清單和方法定義,您可以使用 Get-Member Cmdlet。不過,
使用 Cmdlet 的前提是物件必須以下列幾種形式存在:以變數來代表的形式、將某個
命令指定為 Get-Member 命令的引數而建立的物件,或是沿管線向下傳遞的物件。
例如,假設您已指定字串值給 $a 變數,即表示該變數與字串物件相關聯。若要檢視
此物件的方法清單,請在 PowerShell 命令提示字元輸入下列命令:

代碼:

       Get-Member -inputobject $a -membertype method


如果您想查看沿管線向下傳遞的物件相關方法與方法定義,請在管線中使用
Get-Member 命令,如以下範例所示:

代碼:

       Get-ChildItem c:\final.txt | Get-Member -membertype method


呼叫方法最常用的方式是在物件參照 (例如變數或運算式) 後面指定方法名稱。物件
參照和方法之間必須以句號分隔。此外,方法名稱後面必須立即加上括號,將您要
傳遞給方法的引數含括在內。

即使方法簽名碼表示不必傳遞任何引數,仍然需要加上左右括號。

例如,下列命令使用 GetType() 方法傳回與 $a 字串物件相關聯的資料型別:

代碼:

       $a.GetType()


GetType() 方法將傳回任意物件的資料型別,而變數則始終代表物件。物件的型別取
決於儲存在該變數中的資料型別而定。

PowerShell 中所執行的每個動作都和物件有關,不論是宣告變數乃至於將命令整併為
單一管線都一樣。因此,方法可運用在各種不同的情況。例如,您可以使用方法對
屬性值採取動作,如下列命令所示:

代碼:

       (Get-ChildItem c:\final.txt).name.ToUpper()


在此範例中,所呼叫的 ToUpper 方法其所屬物件是與 name 屬性相關聯的字串物件
(請注意 final.txt 檔案必須存在於 c: 磁碟機的根目錄中,否則此範例將無法運
作)。name 屬性其實是由 Get-ChildItem 命令所傳回之 FileInfo 物件的屬性之一。
這不僅展露 PowerShell 的物件導向本質,更印證了您可以對任何可存取的物件
呼叫其方法。

若將 Get-ChildItem 命令輸出儲存至變數,也能達到和前述範例相同的結果,如以下
範例所示:

代碼:

       $a = (Get-ChildItem c:\final.txt).name
       $a.ToUpper()


此命令將 Get-ChildItem 命令傳回的檔案名稱儲存至變數,且同樣使用了與該變數相
關聯之字串物件的 ToUpper() 方法。

在某些情況下,方法必須經由引數指引以執行其本身的動作。例如,FileInfo 物件所
包含的 MoveTo() 方法可將檔案從某位置移到另一位置。此方法必須以引數指定
檔案的目標位置。下列命令示範如何加上這個引數:

代碼:

      (Get-ChildItem c:\final.txt).MoveTo("c:\techdocs\final.txt")


Get-ChildItem 命令傳回代表 final.txt 檔案的 FileInfo 物件,然後使用該物件的
MoveTo 方法啟動動作,並指定檔案的新位置。

如需得知某個方法的相關引數,請查閱對應的方法定義。方法定義包含一或多個方法
簽名碼 (在 .NET Framework 中也稱為多載)。方法簽名碼則包含方法的名稱,以及
呼叫方法時必須提供的參數 (零個或以上)。在 Get-Member Cmdlet 顯示畫面中,每個
方法簽名碼與其前一個簽名碼之間以逗號分隔。例如,FileInfo 類別的 CopyTo 方法
包含下列兩個方法簽名碼:

代碼:

      1. CopyTo(String destFileName)
      2. CopyTo(String destFileName, Boolean overwrite)


第一個方法簽名碼接受要將來源檔案複製過去的目的檔名 (包含路徑)。以下範例使用
第一個 CopyTo 方法將 final.txt 複製到 c:\bin 目錄中:

代碼:

      (Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")


如果該檔案已存在於目的地位置,CopyTo 方法就會失敗,且 PowerShell 將回報下列
錯誤:

以 "1" 引數呼叫 "CopyTo" 時發生例外狀況: 檔案 'c:\bin\final.txt' 已經存在。

使用第二個方法簽名碼時,除了傳遞如同第一種情況的目的檔名之外,還必須傳遞
布林值指定是否覆寫目的地位置上存在的同名檔案,如以下範例所示:

代碼:

      (Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)


每次傳遞布林值時都必須使用 $true 變數,此為 PowerShell 自動建立的變數。
$true 變數中包含布林值 "true" (如您預期,$false 變數中則包含布林值
"false")。


PowerShell 函數語法



函數一種具名的程式碼區塊,您可以在 Windows PowerShell 命令中予以參照。只要
呼叫函數名稱,就會執行函數內部的程式碼,就如同您輸入了函數的程式碼區塊一樣。
函數可以接受匯入值 (您呼叫函數時所指定的引數) 或是透過目前管線傳遞給函數
的值。函數所傳回的值則可指定給變數,或是傳遞給其他函數或 cmdlet。

Windows PowerShell 支援兩種函數:一般函數和篩選器。這兩種函數的主要差別在於
處理的方式。當您呼叫一般函數時,傳入函數的物件會繫結到 $input 自動變數,
並等待從管線收到所有的輸入後才解除封鎖而開始執行。這可確保函數先收到全部
所需的資料,然後才開始處理資料。

然而,篩選器會立即處理收到的資料 (以便即時採取篩選動作)。每當從管線收到內送
物件後就會呼叫篩選器,而不是等待所有的輸入都到齊。篩選器透過 $_ 自動變數
接收來自管線的每個物件,且其指令碼區塊將處理每個物件。

若要建立一般函數或篩選器,必須指定幾個必要元素。您也可以指定選擇性元素。下
列語法顯示構成函數定義的各種元件:

代碼:

       function function_name
       {
       
       }
       
       filter filter_name
       {
       
       }


下表說明函數定義中的每個元素:

代碼:

   元素              描述                                        是否必要
   ----------------- ------------------------------------------- ---------
   function | filter 務必指定的關鍵字,兩者擇其一                是
   範圍類型:         指定範圍以覆蓋預?#93;範圍                      否
   名稱              函數或篩選器的名稱                          是
   { }               大括號用以含括參數定義和指令碼區塊          是
   param(參數清單)   param 關鍵字?#91;上括號用以含括參數清單。否
                     清單中?#93;含以逗號分隔的參數名稱。
                     或者,參數名稱前面亦可?#91;上資料型別名稱
                     (置於方括號中)
   指令碼區塊        函數或篩選器運作的邏輯                      是

   最基本的函數定義只?#93;含?#125;頭的關鍵字 (function 或 filter)、函數或篩選器的
   名稱,以及指令碼區塊 (置於大括號中)。以下定義,定義了只?#93;含必要元素
   的一般函數:


代碼:

       function small_files
       {
           Get-ChildItem c:\ | where { $_.length -lt 100
               -and !$_.PSIsContainer}
       }


此定義建立了名稱為 small_files 的函數。最外圍大括號中的指令碼區塊下達命令呼
叫 Get-ChildItem cmdlet。這個 cmdlet 的輸出接著傳送給 Where-Object cmdlet,
以選取檔案大小 (length 屬性) 小於 100 個位元組而且不是容器的物件。

建立函數之後,您即可在 Windows PowerShell 命令中呼叫函數名稱,進而執行函數的
指令碼區塊,如以下範例所示:

代碼:

       small_files


執行此命令會傳回小於 100 個位元組的檔案。

建立篩選器的做法與建立一般函數幾乎完全相同。以下範例定義了名稱為 process_c
的篩選器。

代碼:

       filter process_c
       {
           $_.processname -like "c*"
       }


在此定義中,指令碼區塊內的程式碼可供 Where-Object 命令用於篩選資料。例如,
下列命令會執行 Get-Process cmdlet,然後將處理序物件傳送給
Where-Object cmdlet。

代碼:

       Get-Process | where { process_c }


此命令傳回的資料包含了名稱以字母 c 開頭的所有處理序。

使用參數
函數最實用的功能之
________________

美術插畫設計案子報價系統 v0.1 Beta
爪哇禾雀
Type



繪圖畫廊設計藝廊
攝影相簿留言板
最愛收藏分類標籤
暱稱: Type
註冊: 2002-11-30
發表: 11072
來自: vovo2000.com
V幣: 900702
Re: PowerShell 語法說明/範例教學 2011-11-16 16:38
/ / /

PowerShell 指令 Alias


代碼:

CommandType     Name                                                                    Definition
-----------     ----                                                                    ----------
Alias           ac                                                                      Add-Content
Alias           asnp                                                                    Add-PSSnapin
Alias           clc                                                                     Clear-Content
Alias           cli                                                                     Clear-Item
Alias           clp                                                                     Clear-ItemProperty
Alias           clv                                                                     Clear-Variable
Alias           cpi                                                                     Copy-Item
Alias           cpp                                                                     Copy-ItemProperty
Alias           cvpa                                                                    Convert-Path
Alias           diff                                                                    Compare-Object
Alias           epal                                                                    Export-Alias
Alias           epcsv                                                                   Export-Csv
Alias           fc                                                                      Format-Custom
Alias           fl                                                                      Format-List
Alias           foreach                                                                 ForEach-Object
Alias           %                                                                       ForEach-Object
Alias           ft                                                                      Format-Table
Alias           fw                                                                      Format-Wide
Alias           gal                                                                     Get-Alias
Alias           gc                                                                      Get-Content
Alias           gci                                                                     Get-ChildItem
Alias           gcm                                                                     Get-Command
Alias           gdr                                                                     Get-PSDrive
Alias           ghy                                                                     Get-History
Alias           gi                                                                      Get-Item
Alias           gl                                                                      Get-Location
Alias           gm                                                                      Get-Member
Alias           gp                                                                      Get-ItemProperty
Alias           gps                                                                     Get-Process
Alias           group                                                                   Group-Object
Alias           gsv                                                                     Get-Service
Alias           gsnp                                                                    Get-PSSnapin
Alias           gu                                                                      Get-Unique
Alias           gv                                                                      Get-Variable
Alias           gwmi                                                                    Get-WmiObject
Alias           iex                                                                     Invoke-Expression
Alias           ihy                                                                     Invoke-History
Alias           ii                                                                      Invoke-Item
Alias           ipal                                                                    Import-Alias
Alias           ipcsv                                                                   Import-Csv
Alias           mi                                                                      Move-Item
Alias           mp                                                                      Move-ItemProperty
Alias           nal                                                                     New-Alias
Alias           ndr                                                                     New-PSDrive
Alias           ni                                                                      New-Item
Alias           nv                                                                      New-Variable
Alias           oh                                                                      Out-Host
Alias           rdr                                                                     Remove-PSDrive
Alias           ri                                                                      Remove-Item
Alias           rni                                                                     Rename-Item
Alias           rnp                                                                     Rename-ItemProperty
Alias           rp                                                                      Remove-ItemProperty
Alias           rsnp                                                                    Remove-PSSnapin
Alias           rv                                                                      Remove-Variable
Alias           rvpa                                                                    Resolve-Path
Alias           sal                                                                     Set-Alias
Alias           sasv                                                                    Start-Service
Alias           sc                                                                      Set-Content
Alias           select                                                                  Select-Object
Alias           si                                                                      Set-Item
Alias           sl                                                                      Set-Location
Alias           sleep                                                                   Start-Sleep
Alias           sort                                                                    Sort-Object
Alias           sp                                                                      Set-ItemProperty
Alias           spps                                                                    Stop-Process
Alias           spsv                                                                    Stop-Service
Alias           sv                                                                      Set-Variable
Alias           tee                                                                     Tee-Object
Alias           where                                                                   Where-Object
Alias           ?                                                                       Where-Object
Alias           write                                                                   Write-Output
Alias           cat                                                                     Get-Content
Alias           cd                                                                      Set-Location
Alias           clear                                                                   Clear-Host
Alias           cp                                                                      Copy-Item
Alias           h                                                                       Get-History
Alias           history                                                                 Get-History
Alias           kill                                                                    Stop-Process
Alias           lp                                                                      Out-Printer
Alias           ls                                                                      Get-ChildItem
Alias           mount                                                                   New-PSDrive
Alias           mv                                                                      Move-Item
Alias           popd                                                                    Pop-Location
Alias           ps                                                                      Get-Process
Alias           pushd                                                                   Push-Location
Alias           pwd                                                                     Get-Location
Alias           r                                                                       Invoke-History
Alias           rm                                                                      Remove-Item
Alias           rmdir                                                                   Remove-Item
Alias           echo                                                                    Write-Output
Alias           cls                                                                     Clear-Host
Alias           chdir                                                                   Set-Location
Alias           copy                                                                    Copy-Item
Alias           del                                                                     Remove-Item
Alias           dir                                                                     Get-ChildItem
Alias           erase                                                                   Remove-Item
Alias           move                                                                    Move-Item
Alias           rd                                                                      Remove-Item
Alias           ren                                                                     Rename-Item
Alias           set                                                                     Set-Variable
Alias           type                                                                    Get-Content





PowerShell Commandlet 常用參數



代碼:


    參數           描述
    ---------      --------------------------------------------------

    Verbose        Boolean (布林值)。產生與作業有關的詳細資訊,就好像追蹤記錄或
                   交易記錄。只有用在產生詳細資訊資料的 cmdlet 中,此參數才有
                   效用。

    Debug          Boolean (布林值)。產生與作業有關的�{式�]計層級詳細資料。只有
                   用在產生偵錯資料的 cmdlet 中,此參數才有效用。

    ErrorAction    Enum (列舉)。決定 cmdlet 在錯誤發生時該如何回應。其值為:
                   Continue [預�]值]、Stop、SilentlyContinue、Inquire。

    ErrorVariable  String (字串)。指定變數用於儲存命令在處理期間傳回的錯誤。此
                   變數會隨 $error 一同傳播。

    OutVariable    String (字串)。指定變數用於儲存命令在處理期間傳回的輸出。

    OutBuffer      Int32 (整數)。決定在呼叫管線中的下一個 cmdlet 命令前,要放入
                   緩衝區的物件數目。


    除了一般參數外,會變更系統狀態的 cmdlet 還支援下列兩個參數。

    參數          描述
    ---------     -------------------------------------------------------

    WhatIf        Boolean (布林值)。說明執行命令時將會發生何種情況,但不會實際
                  執行命令。

    Confirm       Boolean (布林值)。在執行任何修改系統的動作前,提示使用者出示
                  權限。




PowerShell 關連性陣列(Associative Array)



關聯陣列提供用於儲存多重索引鍵/值配對的資料結構。例如,個人的姓名就像是索引
鍵,而個人的出生日期則像是值。關聯陣列提供的結構可儲存姓名和出生日期的
集合,其中每個姓名都有對應的出生日期。可以將關聯陣列想像成兩欄的表格,
第一欄是索引鍵,第二欄則是值。

關聯陣列與 PowerShell 中的標準陣列類似,但並非依索引編號來參照陣列的內容,而
是依索引鍵來參照關聯陣列中的資料元素。PowerShell 會依據索引鍵從關聯陣列傳回
對應的值。

PowerShell 使用雜湊表資料型別藉以儲存關聯陣列的內容,原因在於這種資料結構提
供快速的搜尋機制。這一點極為重要,因為關聯陣列的主要用途正是提供高效率的
搜尋機制。

在關聯陣列中,您可以使用異質資料型別。例如,關聯陣列可建立成包含整數、
Cmdlet 呼叫和字串,三者各自指定不同的索引鍵。

關聯陣列的語法如下:

代碼:

       $<�}列名稱> = @{<索引鍵1 = 項目1>; <索引鍵2 = 項目2>;...}


建立與初始化關聯陣列的方式大致如同建立與初始化標準陣列。然而,關聯陣列還必
須符合下列要求:

* 關聯陣列中的每個值應指定標籤。

* 陣列內容的外面應附加 @ 記號。

* 包含空格的索引鍵或值應置於單引號或雙引號中。

例如,若要建立名稱為 $phone 的關聯陣列,且包含 Kim Akers、Ken Myers 和 Greg
Chapman 的電話號碼,請在 PowerShell 命令提示字元輸入下列單行命令:

代碼:

       $phone = @{'Kim Akers' = '(425) 555-0183'; 'Ken Myers' =
       '(425) 555-0184'; 'Greg Chapman' = '(425) 555-0185'}


若要顯示陣列的內容,請輸入下列命令:

代碼:

       $phone


執行此命令之後的輸出結果如下:

代碼:

   索引鍵                         值
   ------------------------------ --------------
   Ken Myers                      (425) 555-0184
   Greg Chapman                   (425) 555-0185
   Kim Akers                      (425) 555-0183



您可以使用數種方法選擇所要顯示的元素。不論是句號標記法或陣列標記法皆可。例
如,下列兩個命令都會顯示 Greg Chapman 索引鍵的電話號碼:

代碼:

        $phone.'Greg Chapman'
        $phone['Greg Chapman']


索引鍵和值只有包含空格時才必須加上引號 (單引號或雙引號),否則就不需要引號。
例如,下列單行命令不需要引號:

代碼:

        $phone = @{Kim_Akers = 4255550183; Ken_Myers = 4255550184;
        Greg_Chapman = 4255550185}


然而,若您打算將索引鍵的關聯值儲存成字串常值,則應將值置於單引號或雙引號中。
例如,假設您使用下列命令建立 $phone 關聯陣列:

代碼:

        $phone = @{Kim_Akers = 425-555-0183; Ken_Myers =
        425-555-0184; Greg_Chapman = 425-555-0185}


輸入 $phone 之後的輸出結果會變成這樣:

代碼:

    索引鍵                         值
    ------------------------------ -----
    Kim_Akers                      -313
    Greg_Chapman                   -315
    Ken_Myers                      -314


由於指定的值沒有加上單引號或雙引號,PowerShell 會將各個值解譯為整數,並將連
字號解譯為減法運算子 (例如,425-555-0183 = -313)。使用下列命令即可避免此
問題:

代碼:

        $phone = @{Kim_Akers = '425-555-0183'; Ken_Myers =
        '425-555-0184'; Greg_Chapman = '425-555-0185'}


上述幾個範例示範了包含同質資料型別的關聯陣列。使用 GetType 方法可確認關聯陣
列屬於 hashtable (雜湊表) 資料型別,如下所示:

代碼:

        $phone.GetType()


若要檢查關聯陣列中個別元素的資料型別,請使用下列其中一種方法,呼叫 $phone 關
聯陣列同時指定索引鍵:

代碼:

        $phone.Kim_Akers.GetType()
        $phone['Kim_Akers'].GetType()


關聯陣列可以包含不同的資料型別組合,如以下範例所示:

代碼:
       
        $hashMix = @{Key1 = 1; Key2 = Get-ChildItem ; Key3 =
        "testing"}


在此範例中,Key1 包含整數,Key2 包含 Cmdlet 的執行結果,且 Key3 包含字串。
________________

美術插畫設計案子報價系統 v0.1 Beta
爪哇禾雀
Type



繪圖畫廊設計藝廊
攝影相簿留言板
最愛收藏分類標籤
暱稱: Type
註冊: 2002-11-30
發表: 11072
來自: vovo2000.com
V幣: 900702





資訊相關理論、技術、管理、應用、產品等
發表新主題 回覆主題