茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1673261 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_00072.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2015/11/30 9:28:30
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 檔案中修改特定型別的 元素。例如,陣列型別預設並沒有
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
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|