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

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00061.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

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

發表者: 冷日 發表時間: 2015/11/30 9:54:00
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 開頭的所有處理序。
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

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

選項

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