共用方式為


3. 基本概念

編輯附註

重要

Windows PowerShell 語言規格 3.0 於 2012 年 12 月發行,並以 Windows PowerShell 3.0 為基礎。 此規格不會反映 PowerShell 的目前狀態。 沒有計劃更新此檔以反映目前的狀態。 此文件在此處作為歷史參考提供。

規格檔可從Microsoft下載中心取得Microsoft Word 檔:https://www.microsoft.com/download/details.aspx?id=36389 Word 檔已於 Microsoft Learn 上轉換以呈現。 在轉換期間,已進行一些編輯變更,以配合 Docs 平臺的格式設定。 已修正某些錯字和次要錯誤。

3.1 提供者和磁碟驅動器

提供者 允許存取命令行無法輕易存取的數據和元件。 數據會以類似文件系統磁碟的格式一致呈現。

提供者公開的資料會顯示在 磁碟驅動器上,並透過 路徑 存取,就像操作磁碟驅動器一樣。 每個提供者的內建 Cmdlet 會管理提供者磁碟驅動器上的數據。

PowerShell 包含下列一組內建提供者,可存取不同類型的數據存放區:

提供者 磁碟驅動器名稱 描述 參考
別名 別名: PowerShell 別名 §3.1.1
環境 Env: 環境變數 §3.1.2
檔案系統 A:、B:、C:、... 磁碟驅動器、目錄和檔案 §3.1.3
功能 功能: PowerShell 函式 §3.1.4
變數 變數: PowerShell 變數 §3.1.5

Windows PowerShell:

提供者 磁碟驅動器名稱 描述
證書 憑證: 數字簽名的 x509 憑證
註冊表 HKLM: (HKEY_LOCAL_MACHINE), HKCU: (HKEY_CURRENT_USER) Windows 註冊表
WSMan WSMan: WS-Management 組態資訊

下列 Cmdlet 會處理提供者和磁碟:

代表提供者的物件類型描述於 !4.5.1。 代表磁碟驅動器的 物件類型會在 •4.5.2中描述。

3.1.1 別名

別名 是命令的替代名稱。 命令可以有多個別名,而且原始名稱及其所有別名都可以交替使用。 別名可以重新指派。 別名是項目(§3.3)。

別名可以指派給另一個別名;不過,新的別名不是原始命令的別名。

提供者 Alias 是一個平面命名空間,只包含代表別名的物件。 變數沒有子項目。

PowerShell 隨附一組內建別名。

下列 Cmdlet 會處理別名:

使用 New-Alias為命令建立別名時,該命令的參數不能包含在該別名中。 不過,在 Alias 命名空間中直接將參數指派給變數是被允許的。

注意

不過,要創建一個函式,該函式除了包含具有所有所需參數的命令調用之外不做其他任何事情,並給這個函式指派一個別名,這其實很簡單。

代表別名的物件類型會在 :4.5.4中描述。

別名物件會儲存在磁碟驅動器別名上:(\3.1)。

3.1.2 環境變數

PowerShell 環境提供者允許擷取、新增、變更、清除和刪除作系統環境變數。

提供者環境是一般命名空間,只包含代表環境變數的物件。 變數沒有子項目。

環境變數的名稱不能包含等號 (=)。

環境變數的變更只會影響目前的會話。

環境變數是項目(§3.3)。

代表環境變數的物件類型描述於 •4.5.6

環境變數物件會儲存在磁碟驅動器 Env 上:(§3.1)。

3.1.3 檔案系統

PowerShell FileSystem 提供者允許建立、開啟、變更和刪除目錄和檔案。

FileSystem 提供者是階層式命名空間,其中包含代表基礎文件系統的物件。

檔案會儲存在名稱如 A:、B:、C:等的磁碟驅動器上(\3.1)。 目錄和檔案是使用路徑表示法來存取(•3.4)。

目錄或檔案是一項目(§3.3)。

3.1.4 函式

PowerShell 函式提供者允許擷取、新增、變更、清除和刪除的函式(\8.10)和篩選條件(\8.10.1)。

provider Function 是只包含函式和篩選物件的一般命名空間。 函式和篩選都沒有子項目。

功能的變更只會影響當前會話。

函式是項目(§3.3)。

代表函式的物件類型會在 §4.5.10中描述。 代表篩選的物件類型會在 •4.5.11中描述。

函式物件會儲存在磁碟驅動器函式上:(#3.1)。

3.1.5 變數

變數可以直接在PowerShell語言中定義和操作。

提供者 Variable 是一般命名空間,只包含代表變數的物件。 變數沒有子項目。

下列 Cmdlet 也會處理變數:

變數是項目(§3.3),所以大部分與 Item 相關的 Cmdlet 都可以操作它。

代表變數的物件類型會在 &中描述。

變數物件會儲存在磁碟驅動器變數上:(\3.1)。

3.2 工作位置

目前的工作位置 是命令指向的預設位置。 如果叫用命令時未提供明確路徑('\3.4),則會使用這個位置。 這個位置包含當前驅動器

PowerShell 主機可能會有多個磁碟驅動器,在此情況下,每個磁碟驅動器都有自己的目前位置。

當磁碟驅動器名稱指定而未提供目錄時,會隱含該磁碟驅動器的目前位置。

目前的工作位置可以儲存在堆疊上,然後設定為新的位置。 之後,可以從堆疊中恢復該儲存的位置,並設為目前的工作位置。 有兩種位置堆疊:預設的工作位置堆疊,以及零個或多個由使用者定義名稱的 工作位置堆疊。 當會話開始時,預設的工作位置堆疊同時成為目前的工作位置堆疊。 不過,任何具名的工作位置堆疊都可以成為目前的工作位置堆疊。

下列 Cmdlet 會處理位置:

  • Set-Location:設定目前的工作區
  • Get-Location:決定指定磁碟驅動器的目前工作位置,或指定堆棧的工作位置
  • Push-Location:將當前工作位置儲存至指定的路徑堆疊頂端
  • Pop-Location:從指定位置堆疊頂端還原目前的工作位置

代表工作位置和工作位置堆疊的物件類型在 第4.5.5節中描述。

3.3 項目

專案 是一個別名 (3.1.1)、變數(3.1.5)、函式 (.1.4)、環境變數(\3.1.2),或文件系統中的檔案或目錄(\3.1.3)。

下列 Cmdlet 會處理項目:

  • 新專案:建立新專案
  • Set-Item:變更一或多個項目的值
  • Get-Item:取得指定位置的項目
  • Get-ChildItem:取得指定位置的項目和子項目
  • 複製專案:將一或多個專案從一個位置複製到另一個位置
  • Move-Item:將一或多個項目從一個位置移到另一個位置
  • Rename-Item:重新命名項目
  • Invoke-Item:對一或多個專案執行默認動作
  • Clear-Item:刪除一或多個項的內容,但不會刪除項(請參閱
  • Remove-Item:刪除指定的項目

下列 Cmdlet 會處理項目的內容:

代表目錄的 物件類型描述於 &4.5.17。 代表檔案的物件類型會在 中描述。

3.4 路徑名稱

數據存放區中的所有項目,都可以透過PowerShell提供者存取,且可以用其路徑名稱唯一識別。 路徑名稱 是專案名稱、專案所在的容器和子容器,以及用來存取容器的 PowerShell 磁碟驅動器的組合。

路徑名稱分成兩種類型之一:完整路徑名稱和相對路徑名稱。 完整路徑名稱 包含組成路徑的所有元素。 下列語法顯示完全限定路徑名稱中的元素:

提示

語法定義中的 ~opt~ 表示法指出語彙實體在語法中是選擇性的。

path:
    provider~opt~   drive~opt~   containers~opt~   item

provider:
    module~opt~   provider   ::

module:
    module-name   \

drive:
    drive-name   :

containers:
    container   \
    containers container   \

模組名稱 指的是父模組。

提供者 指的是通過其存取至數據存放區的 PowerShell 提供者。

磁碟驅動器 是指特定 PowerShell 提供者支援的 PowerShell 磁碟驅動器。

容器 可以包含其他容器,其中可以包含其他容器等等,最後一個容器會保存 專案。 容器必須以存在於數據存放區中的階層式順序來指定。

以下是路徑名稱的範例:

E:\Accounting\InvoiceSystem\Production\MasterAccount\MasterFile.dat

如果路徑中的最後一個元素包含其他元素,則它是 容器元素;否則,它是 葉元素

在某些情況下,不需要完整路徑名稱;相對路徑名稱就已足夠。 相對路徑名稱 是以目前的工作位置 為基礎。 PowerShell 允許根據項目相對於當前工作位置的相對位置來識別項目。 相對路徑名稱牽涉到使用某些特殊字元。 下表說明這些字元的每一個,並提供相對路徑名稱和完整路徑名稱的範例。 資料表中的範例是以目前的工作目錄設定為 C:\Windows 為基礎:

符號 描述 相對路徑 完整路徑
. 目前的工作位置 .\System C:\Windows\System
.. 目前工作位置的父系 ..\Program Files C:\Program Files
\ 目前工作位置的磁碟驅動器根目錄 \Program Files C:\Program Files
沒有 沒有特殊字元 System C:\Windows\System

若要在命令中使用路徑名稱,請輸入該名稱作為完整或相對路徑名稱。

下列 Cmdlet 會處理路徑:

  • Convert-Path:將路徑從 PowerShell 路徑轉換為 PowerShell 提供者路徑
  • Join-Path:將路徑與子路徑結合為單一路徑
  • Resolve-Path:解析路徑中的萬用字元
  • 分割路徑:傳回路徑的指定部分
  • Test-Path:判斷路徑的元素是否存在,或路徑格式是否良好

某些 Cmdlet (例如 Add-ContentCopy-Item 使用檔案篩選。 檔案篩選 是指定從一組路徑選取準則的機制。

代表已解析路徑的物件類型在 §4.5.5中描述。 路徑通常會以字串的形式操作。

3.5 範圍

3.5.1 簡介

名稱可以表示變數、函式、別名、環境變數或磁碟驅動器。 同名可能在腳本中的不同地方表示不同的項目。 對於名稱所表示的每個不同項目,該名稱僅在稱為其 範圍的腳本文字區域內可見。 不同項目以相同名稱表示時,要麼具有不同的範疇,要麼位於不同的命名空間。

範圍可能會巢狀,在此情況下,外部範圍稱為 父範圍, 和任何巢狀範圍都 該父系 子範圍。 名稱的範圍是其定義的範圍,以及所有子範圍,除非設定為私有。 在子範圍中,定義於該處的名稱會隱藏父範圍中以相同名稱定義的任何項目。

除非使用點來源表示法 (•3.5.5),否則下列每一個都會建立新的範圍:

  • 腳本檔案
  • 腳本區塊
  • 函式或篩選

請考慮下列範例:

# Start of script
$x = 2; $y = 3
Get-Power $x $y

# Function defined in script
function Get-Power([int]$x, [int]$y) {
    if ($y -gt 0) {
        return $x * (Get-Power $x (--$y))
    } else {
        return 1
    }
}
# End of script

腳本中建立的變數範圍 $x$y 是該腳本的主體,包括在其中定義的函式。 函式 Get-Power 定義兩個具有相同名稱的參數。 由於每個函式都有自己的範圍,這些變數與父範圍中所定義的變數不同,而且會隱藏父範圍中的變數。 函式範圍嵌套於腳本範圍內。

請注意,這個函式會遞迴地呼叫自己。 每次執行此動作時,它都會建立另一個巢狀範圍,每個都有它自己的變數 $x,並 $y

以下是更複雜的範例,其中也會顯示巢狀範圍和重複使用名稱:

# start of script scope
$x = 2              # top-level script-scope $x created
                    # $x is 2
F1                  # create nested scope with call to function F1
                    # $x is 2
F3                  # create nested scope with call to function F3
                    # $x is 2

function F1 {       # start of function scope
                    # $x is 2
    $x = $true      # function-scope $x created
                    # $x is $true

    & {             # create nested scope with script block
                    # $x is $true
        $x = 12.345 # scriptblock-scope $x created
                    # $x is 12.345
    }               # end of scriptblock scope, local $x goes away

                    # $x is $true
    F2              # create nested scope with call to function F2
                    # $x is $true
}                   # end of function scope, local $x goes away

function F2 {       # start of function scope
                    # $x is $true
    $x = "red"      # function-scope $x created
                    # $x is "red"
}                   # end of function scope, local $x goes away

function F3 {       # start of function scope
                    # $x is 2
    if ($x -gt 0) {
                    # $x is 2
        $x = "green"
                    # $x is "green"
    }               # end of block, but not end of any scope
                    # $x is still "green"
}                   # end of function scope, local $x goes away
# end of script scope

3.5.2 範圍名稱和數字

PowerShell 支援下列範圍:

  • 全域:這是最上層的範圍。 所有自動和喜好設定變數都會在此範圍中定義。 全域範圍是所有其他範圍的父範圍,而所有其他範圍都是全域範圍的子範圍。

  • 本地:這是在腳本、腳本區塊或函式中任何執行點的當前範圍。 任何範圍都可以是區域範圍。

  • 腳本:每個執行的腳本檔案都有此範圍。 腳本範圍是從其中建立之所有範圍的父範圍。 腳本區塊不會 沒有自己的腳本範圍;相反地,其腳本範圍是其最接近祖系腳本檔案的腳本範圍。 雖然模組範圍沒有這類專案,但腳本範圍會提供對等專案。

名稱可以宣告成私有,在此情況下,它們不會顯示在其父級範圍之外,即使子範圍也無法看到。 私有的概念不是獨立範疇;它是本地範圍的別名,如果用作可寫入位置,則會隱藏名稱。

範圍可以透過數字來參考,以描述一個範圍相對於另一個範圍的位置。 範圍 0 代表局部範圍,範圍 1 代表一代上層範圍,範圍 2 代表二代上層範圍,依此類推。 (範圍號碼是由操作變數的 Cmdlet 所使用。

3.5.3 變數名稱範圍

如下列生產環境所示,可以使用六個不同範圍中的任何一個來指定變數名稱:

variable-scope:
    Global:
    Local:
    Private:
    Script:
    Using:
    Workflow:
    variable-namespace

範圍是選擇性的。 下表顯示在所有可能的情境中,每個情境的意義。 當未已明確指定範圍時,它也會顯示該範圍:

範圍修飾詞 腳本檔案內的 腳本區塊內的 函式內部
全球 全域範圍 全域範圍 全域範圍
劇本 最接近的上階腳本檔案的範疇,如果沒有最接近的上階腳本檔案,則為全域範疇。 最接近的上階腳本檔案的範疇,如果沒有最接近的上階腳本檔案,則為全域範疇。 最接近的上階腳本檔案的範疇,如果沒有最接近的上階腳本檔案,則為全域範疇。
私人 全域/程式/本機範圍 區域範圍 區域範圍
本地 全域/程式/本機範圍 區域範圍 區域範圍
Using 已定義的實作 已定義的實作 已定義的實作
Workflow 已定義的實作 已定義的實作 已定義的實作
沒有 全域/程式/本機範圍 區域範圍 區域範圍

使用所列的 Cmdlet 系列時,也可以指定變數範圍資訊(§3.1.5)。 特別是,如需詳細資訊,請參閱 參數 Scope,以及參數 Option PrivateOption AllScope

範圍Using:修飾詞可用來透過 、 Invoke-Commandinlinescript-statement 中的 Cmdlet Start-Job執行腳本時,在另一個範圍中定義的變數。 例如:

$a = 42
Invoke-Command --ComputerName RemoteServer { $Using:a } # returns 42
workflow foo
{
    $b = "Hello"
    inlinescript { $Using:b }
}
foo # returns "Hello"

範圍工作流程會與 parallel-statementsequence-statement 搭配使用,以存取工作流程中定義的變數。

3.5.4 函式名稱範圍

函式名稱也可能有四個不同的範圍之一,且該名稱的可見性與變數的可見性相同('\3.5.3)。

3.5.5 點來源表示法

當腳本檔案、腳本區塊或函式從另一個腳本檔案、腳本區塊或函式內執行時,執行中的腳本檔案會建立新的巢狀範圍。 例如

Script1.ps1
& "Script1.ps1"
& { ... }
FunctionA

不過,點來源表示法 使用時,不會在執行命令之前建立新的範圍,因此本應對其自身本地範圍進行的新增/變更將會作用於目前範圍。 例如

. Script2.ps1
. "Script2.ps1"
. { ... }
. FunctionA

3.5.6 模組

就像最上層腳本檔案位於階層式巢狀範圍樹狀結構的根目錄,同樣地,每個模組也是如此(§3.14)。 不過,根據預設,只有模組導出的名稱才能在匯入內容中依名稱取得。 Cmdlet 的 Global 參數 Import-Module 可讓導出的名稱提高可見度。

3.6 唯讀和常數屬性

變數和別名是由包含許多屬性的物件所描述。 這些屬性是由兩個 Cmdlet 系列所設定和操作(\3.1.5\3.1.1)。 其中一個這類屬性是 Options,可設定為 ReadOnly 或 Constant(使用 Option 參數)。 您可以移除標示為 ReadOnly 的變數或別名,而且只要指定 Force 參數,就可以變更其屬性。 不過,無法移除標示為 Constant 的變數或別名,也無法移除其屬性。

3.7 方法多載和呼叫解析

3.7.1 簡介

如 •1 中所述,執行環境所提供的外部程式(並以PowerShell以外的某些語言撰寫)稱為 方法

方法名稱及其參數的數目和類型,統稱為該方法 簽章。 (請注意,簽章不包含方法的傳回類型。執行環境可能會允許類型具有多個具有相同名稱的方法,前提是每個方法都有不同的簽章。 定義了某些方法的多個版本時,即稱該方法為 多載。 例如,Math 類型 (•4.3.8) 包含一組稱為 Abs的方法,其會計算指定數字的絕對值,其中指定的數位可以有一個類型。 該集合中的方法具有下列簽章:

Abs(decimal)
Abs(float)
Abs(double)
Abs(int)
Abs(long)
Abs(SByte)
Abs(Int16)

在此情況下,所有方法都有相同的參數數目,其簽名僅在參數類型上有所不同。

另一個範例涉及 Array 類型(§4.3.2),其中包含一組稱為 Copy 的方法,這些方法會從一個陣列中複製元素到另一個陣列,從每個陣列的開頭(預設)或在某些指定的元素開始。 該集合中的方法具有下列簽章:

Copy(Array, Array, int)
Copy(Array, Array, long)
Copy(Array, int, Array, int, int)
Copy(Array, long, Array, long, long)

在此情況下,簽章會因自變數類型而有所不同,在某些情況下,依自變數編號也不同。

在大部分的多載方法呼叫中,傳遞的自變數數目和類型完全符合其中一個多載,而且選取的方法很明顯。 不過,如果情況並非如此,就必須有方法來解決要呼叫哪個重載版本,如果有的話。 例如

[Math]::Abs([byte]10) # no overload takes type byte
[array]::Copy($source, 3, $dest, 5L, 4) # both int and long indexes

其他範例包括 字串 類型(亦即 System.String),其具有許多多載方法。

雖然 PowerShell 具有解析不完全符合多載簽章的方法呼叫的規則,但 PowerShell 本身並不提供定義多載方法的方式。

注意

編輯器的附註:PowerShell 5.0 新增了定義腳本型類別的功能。 這些類別可以包含多載方法。

3.7.2 方法多載解析

假設方法呼叫 (•7.1.3)具有自變數表達式的清單,以及一組 候選方法s(也就是可以呼叫的方法),則選取 最佳方法 的機制稱為 多載解析

假設有一組適用的候選方法 ({3.7.3),則會選取該集合中最好的方法。 如果集合只包含一個方法,則該方法是最佳方法。 否則,最佳方法是相較於指定參數列表的所有其他方法更優的那個方法,並依照§3.7.4中所示的規則。 如果沒有比所有其他方法更好的方法,則方法調用模棱兩可,並回報錯誤。

最佳方法必須能夠在其被呼叫的上下文中被存取。 例如,PowerShell 腳本無法呼叫私用或受保護的方法。

對靜態方法呼叫的最佳方法必須是靜態方法,而呼叫實例方法的最佳方法必須是實例方法。

3.7.3 適用的方法

當下列其中一項成立時,方法會 適用於自變數清單 A 的適用

  • A 中的自變數數目與方法接受的參數數目相同。
  • 方法具有 M 必要參數和 N 個選擇性參數,且 A 中的自變數數目大於或等於 M,但小於 N。
  • 方法可以接受可變數量的參數,而 A 中的參數數量大於方法所能接受的參數數量。

除了有適當的自變數數目之外,A 中的每個自變數都必須符合自變數的參數傳遞模式,而且自變數類型必須符合參數類型,或者必須從自變數類型轉換成參數類型。

如果自變數類型為 ref (\4.3.6),則對應的參數也必須是 ref,而且轉換用途的自變數類型是 ref 自變數的 Property Value 類型。

如果自變數類型是 ref,則對應的參數可以 out,而不是 ref

如果方法接受變數數目的參數,方法可能適用於 正常形式展開形式。 如果 A 中的引數數目與方法接受的參數數目相同,且最後一個參數是陣列,則形式取決於兩種可能的轉換之一的順序:

  • 從 A 中最後一個參數的類型轉換為數組型別時的排序。
  • 從 A 中最後一個參數的類型轉換為陣列型別中的元素類型的排名。

如果第一次轉換(轉換成陣列類型)優於第二次轉換(轉換成陣列的元素類型),那麼該方法將以一般形式適用,否則它將以展開形式適用。

如果自變數比參數多,方法可能只適用於展開格式。 若要以展開形式適用,最後一個參數必須具有陣列類型。 方法會被替換為等效方法,該方法的最後一個參數被替換為足夠的參數,以調整 A 中每個不相符的參數。每個額外的參數類型都是原始方法中最後一個參數的陣列型別的元素類型。 適用方法的上述規則會套用至這個新方法和自變數清單 A。

3.7.4 更好的方法

假設有一組自變數表達式 { E~1~, E~2~, ..., E~N~ } 和兩個應用程式方法的自變數清單 A,M~P~M~Q~ 參數類型 { P~1~, P~2~, ..., P~N~ }{ Q~1~, Q~2~, ..., Q~N~ }M~P~ 累計排名優於 M~Q~

轉換的累計排名計算方式如下。 每個轉換的價值取決於參數數目的不同,其中 E~1~ 的轉換價值為 N,E~2~ 的轉換價值為 N-1,一直到 E~N~ 的轉換價值為 1。 如果從 E~X~ 轉換成 P~X~ 比從 E~X~Q~X~的轉換更好,則 M~P~ 會累積 N-X+1;否則,M~Q~ 會累積 N-X+1。 如果 M~P~M~Q~ 具有相同的值,則會依序套用下列系結中斷規則:

  • 參數類型(忽略自變數類型)之間的轉換累計排名是以類似於先前排名的方式計算的,因此 P~1~ 會與 Q~1~比較,P~2~Q~2~比較,...,P~N~Q~N~比較。 如果自變數 $null,或參數類型不是數值類型,則會略過比較。 如果自變數轉換 E~X~ 在轉換成 P~X~ 時遺失資訊,但在轉換成 Q~X~時不會遺失資訊,則也會略過比較,反之亦然。 如果要比較參數轉換類型,那麼如果從 P~X~ 轉換到 Q~X~ 的效果比從 Q~X~P~X~更好,則 M~P~ 會累積 N-X+1,否則 M~Q~ 會累積 N-X+1。 如果轉換中沒有任何資訊遺失,則此中斷規則旨在偏好 最特定的方法(亦即具有最小數據類型的參數的方法),或偏好 最一般的方法(亦即具有最大數據類型之參數的方法)如果轉換會導致資訊遺失。
  • 如果這兩種方法都使用其展開形式,則具有更多參數的方法會是更好的方法。
  • 如果其中一個方法使用展開的窗體,而另一個方法則使用一般窗體,則使用一般窗體的方法是較佳的方法。

3.7.5 更好的轉換

以下標示如下的文字是 Windows PowerShell 特有的。

轉換會以下列方式進行排名,從最低到最高:

  • T~1~[]T~2~[] 的情況下,T~1~T~2~ 之間不存在可指派的轉換。
  • T 轉換為字串,其中 T 是任何類型
  • T~1~T~2~,其中 T~1~T~2~ 以實作定義的方式定義自定義轉換
  • T~1~T~2~ 其中 T~1~ 實現了 IConvertible
  • T~1~T~2~,且由 T~1~T~2~ 實作方法 T~2~ op_Implicit(T1)
  • T~1~T~2~,且由 T~1~T~2~ 實作方法 T~2~ op_Explicit(T1)
  • T~1~ T~2~,其中 T~2~ 實作了一個接受 T~1~ 類型單一參數的建構函式。
  • 下列任一轉換:
    • 字串 T,其中 T 實作靜態方法 T Parse(string)T Parse(string, IFormatProvider)
    • T~1~T~2~,其中 T~2~ 為任意列舉,T~1~ 為字串或可轉換為字串的物件集合
  • T 至 PSObject,其中 T 為任何類型
  • 下列任一轉換:Language
    • T 轉換為布林值,其中 T 可是任何數值類型
    • 字串 T,其中 Tregexwmisearcherwmiwmiclassadsiadsisearchertype
    • Tbool
    • T~1~ 到 Nullable[T~2~],若存在從 T~1~T~2~ 的轉換
    • T 設為 void
    • T~1~[]T~2~[] 範圍內,存在一個可在 T~1~T~2~ 之間指派的轉換
    • T~1~T~2~[],其中 T~1~ 是一個集合
    • IDictionaryHashtable
    • Tref
    • Txml
    • scriptblockdelegate
    • T~1~T~2~,其中 T~1~ 為整數類型,T~2~ 為列舉類型
  • $null T 其中 T 為任何數值類型
  • $nullT,其中 T 是任何參考型別
  • 下列任何轉換:
    • 位元組映射到 T,其中 TSByte

    • UInt16 T,其中 TSBytebyteInt16

    • Int16T,其中 TSBytebyte

    • UInt32T,其中 TSBytebyteInt16UInt16int

    • intTTSBytebyteInt16UInt16

    • UInt64 T TSBytebyteInt16UInt16intUInt32long

    • longT 之間,TSBytebyteInt16UInt16intUInt32

    • float T 其中 T 為任何整數類型或 decimal

    • double T 其中 T 為任何整數類型或 decimal

    • decimal T 其中 T 為任何整數類型

  • 下列任何轉換:
    • SByteTTbyteuint6UInt32UInt64
    • Int16 T,其中 TUInt16UInt32UInt64
    • intT,其中 TUInt32UInt64
    • longUInt64
    • decimalT,其中 Tfloatdouble
  • 下列任何轉換:
    • T string 其中 T 為任何數值類型
    • T char 其中 T 為任何數值類型
    • string T 其中 T 為任何數值類型
  • 下列任一轉換,這些轉換都會被視為可指派的轉換:
    • byte T,其中 TInt16UInt16intUInt32longUInt64singledoubledecimal
    • SByte T,其中 TInt16UInt16intUInt32longUInt64singledoubledecimal
    • UInt16T,其中 TintUInt32longUInt64singledoubledecimal
    • Int16T,其中 TintUInt32longUInt64singledoubledecimal
    • UInt32TTlong或是 UInt64singledouble,或 decimal
    • intT,其中 TlongUInt64singledoubledecimal
    • singledouble
  • T~1~ T~2~,其中 T~2~T~1~的基類或介面。 此轉換會被視為可指派的轉換。
  • stringchar[]
  • TT,這種轉換被視為一種可指派的轉換。

對於格式 T~1~ 轉換成 T~2~[],其中 T~1~ 不是陣列而且沒有其他轉換適用的情況下,如果存在從 T~1~ 轉換到 T~2~的轉換,則該轉換的排名會比從 T~1~ 轉換到 T~2~的轉換低,但高於所有排名低於從 T~1~ 轉換到 T~2~ 的轉換。

3.8 名稱查閱

可以有不同種類的命令,且名稱相同。 在這類情況下執行名稱查閱的順序是別名、函式、Cmdlet 和外部命令。

3.9 類型名稱查找

§7.1.10 包含以下敘述:「類型常值 在實作中由某種未 指定的基礎類型表示。」 因此,類型名稱與其基礎類型同義。類型的範例為 intdoublelong[]Hashtable

類型名稱的比對如下:將指定的類型名稱與內建 類型加速器清單進行比較,例如 int、long、double。 如果找到相符項目,即為類型。 否則,假設類型名稱是完整限定的,並查看主機系統上是否存在這類類型。 如果找到相符項目,即為類型。 否則,將命名空間前置詞新增為 System.。 如果找到相符項目,即為類型。 否則,類型名稱發生錯誤。 此演算法會針對泛型型別的每個類型自變數套用。 不過,無需指定元數(函式或運算符使用的參數或運算元的數量)。

3.10 自動記憶體管理

各種運算符和 cmdlet 會導致記憶體配置給參考型別物件,例如字串和陣列。 此記憶體的配置和釋放是由 PowerShell 執行時間系統所管理。 也就是說,PowerShell 提供自動 垃圾收集功能

3.11 執行順序

副作用 是命令執行環境狀態的變更。 變更變數的值(透過指派運算符或遞增和遞減運算符的前置和後置)是一種副作用,檔案內容的變更亦然。

除非另有指定,否則語句會以語匯順序執行。

除了針對某些運算子有明確規定外,表達式中項目評估的順序及副作用發生的順序都是未指定的。

調用命令的表達式涉及命令指定的表達式,及零個或多個用於傳遞至該命令的參數表達式。 這些表達式的評估順序尚未指定,彼此之間沒有特定的順序。

3.12 錯誤處理

當命令失敗時,這會被視為 錯誤,且該錯誤的相關訊息會記錄在 錯誤記錄中,其類型未指定(§4.5.15);然而,此類型支援下標。

錯誤分為兩個類別的其中一個。 它要麼終止作業(終止錯誤),要麼不終止作業(非終止錯誤)。 發生終止錯誤時,會記錄錯誤並停止作業。 當發生非終止性錯誤時,錯誤會被記錄下來,然後繼續進行作業。

非終止錯誤將寫入錯誤訊息流。 雖然該資訊可以重新導向至檔案,但錯誤物件會先轉換成字串,以致於該物件中的重要資訊無法被擷取,從而使診斷變得困難甚至不可能。 相反地,錯誤文字可以重新導向 (\7.12),並將錯誤物件儲存在變數中,如 $Error1 = command 2>&1所示。

自動變數 $Error 包含代表最近錯誤的錯誤記錄集合,而最新的錯誤位於 $Error[0]中。 此集合維持在緩衝區中,因此在新增記錄時會捨棄舊記錄。 自動變數 $MaximumErrorCount 控制可儲存的記錄數目。

$Error 包含來自所有命令的所有錯誤,這些錯誤被混合在一個集合中。 若要從特定命令收集錯誤,請使用 common 參數 ErrorVariable,這可指定使用者定義的變數來保存集合。

3.13 管線

管線 是一系列由管道運算符分隔的一或多個命令 |(U+007C)。 每個命令都會接收前一個指令的輸入,並將輸出寫入下一個指令。 除非管線結尾的輸出遭到捨棄或重新導向至檔案,否則它會傳送至主機環境,而該環境可能會選擇將它寫入標準輸出。 管線中的命令也可以接收自變數的輸入。 例如,請考慮使用下列命令,Get-ChildItemSort-ObjectProcess-File,在指定的檔案系統目錄中建立檔名清單、排序一組文字記錄,以及分別對文字記錄執行一些處理:

Get-ChildItem
Get-ChildItem E:*.txt | Sort-Object -CaseSensitive | Process-File >results.txt

在第一個案例中,Get-ChildItem 會建立目前/預設目錄中檔案名稱的集合。 該集合會傳送至主機環境,根據預設,會將每個元素的值寫入標準輸出。

在第二個案例中,Get-ChildItem 會使用 自變數 E:*.txt,在指定的目錄中建立檔案名稱的集合。 該集合被寫入指令 Sort-Object,根據預設,它們會以區分大小寫的方式(根據 CaseSensitive 參數)進行遞增排序。 產生的集合接著會寫入命令 Process-File,這會執行一些 (未知) 處理。 然後,該命令的輸出會重新導向至檔案 results.txt

如果指令寫入單一物件,下一個指令就會接收該物件,然後在將自己的物件寫入下一個指令後終止。 不過,如果命令寫入多個物件,則會一次一個傳遞給後續命令,而後續命令會針對每個物件執行一次。 此行為稱為 串流。 在串流處理中,物件會在一旦可用時立即寫入流水線,而不是等到整個集合產生後。

處理集合時,可以寫入命令,使其可以在初始專案之前和最後一個專案之後執行特殊處理。

3.14 模組

模組 是一個獨立可重複使用的單元,可讓 PowerShell 程式代碼進行分割、組織及抽象化。 模組可以包含命令(例如 Cmdlet 和函式)和專案(例如變數和別名),可用來作為單一單位。

建立模組之後,必須先 匯入會話,才能使用其內的命令和專案。 匯入之後,命令和項目的行為就如同在本機定義一樣。 模組會使用 Import-Module 命令明確匯入。 模組也可以根據實作所定義的方式自動匯入。

代表模組的物件類型會在 中描述。

模組會在 \11 中詳細討論。

3.15 通配符表達式

通配符表示式可能包含下列元素的零或多個:

元素 描述
*、?或 [ 以外的字元 比對一個字元
* 比對零個或更多個字元 若要比對 * 字元,請使用 [*]。
? 比對任何一個字元。 如何匹配? character 使用[?]。
[設定]

比對 設定的任何一個字元,這不能是空的。

如果 設定 開頭為 ],則右方括弧會視為 的一部分,而下一個右方括號會終止集合;否則,第一個右方括弧會終止集合。

如果 集合 的開頭或結尾是 -,則該連字號被視為 集合的一部分;否則,它表示一個由連續 Unicode 字碼點構成的範圍,其中連字號兩端的字符為包含範圍的界限。 例如,A-Z 表示 26 個大寫英文字母,而 0-9 表示 10 個小數位數。

注意

如需詳細資訊,請參閱 Open Group Base Specifications:Pattern Matching“,IEEE Std 1003.1, 2004 Edition。。 不過,在 PowerShell 中,逸出字元是反引號,而不是反斜線。

3.16 正則表達式

正規表示式可能包含下列元素的零或多個:

元素 描述
.、[、^、*、$或 \ 以外的字元 比對一個字元
. 比對任何一個字元。 進行比對作業。 字元,使用 \..
[設定]
[^set]

[] 格式匹配 的任何一個字元。 [^] 形式與 集合中沒有任何字元相符。 不可以是空的。

如果 開頭為 ] 或 ^],該右方括弧會視為 的一部分,而下一個右方括號會終止該集合;否則,第一個右方括弧會終止集合。

如果 設定 開頭為 - 或 ^-,或結尾為 -,該連字號減號會視為 的一部分;否則,它會指出連續 Unicode 字碼點的範圍,其中連字減號兩側的字符為包含範圍的定界符。 例如,A-Z 表示 26 個大寫英文字母,而 0-9 表示 10 個小數位數。

* 比對前一個項目的出現次數為零。
+ 比對前一個元素的一次或多次出現。
? 比對前一個元素零次或一次。
^ 比對匹配字串的開頭。 若要比對 ^ 字元,請使用 \^。
$ 匹配字串結尾的。 若要比對 $ 字元,請使用 $。
\ c 逸出字元 c,因此無法辨識為正則表示式專案。

Windows PowerShell:支援Microsoft .NET Framework 正則表達式中提供的字元類別,如下所示:

元素 描述
\p{name} 名稱所指定的具名字符類別中比對任何字元。 支援的名稱為 Unicode 群組和區塊範圍,例如 Ll、Nd、Z、IsGreek 和 IsBoxDrawing。
\P{name} 比對 名稱中指定的群組和區塊範圍中未包含的文字,
\w 比對任何單字字元。 相當於 unicode 字元類別 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]。 如果使用 ECMAScript 選項指定符合 ECMAScript 規範的行為,\w 就相當於 [a-zA-Z_0-9]
\W 比對任何非單字字元。 相當於 unicode 類別 [\^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]
\s 匹配任何白空字符。 相當於 unicode 字元類別 [\f\n\r\t\v\x85\p{Z}]
\S 比對任何非空格字元。 相當於 unicode 字元類別 [\^\f\n\r\t\v\x85\p{Z}]
\d 符合任何十進位數。 相當於 unicode 的 \p{Nd},以及非 Unicode 行為的 [0-9]
\D 比對任何非數字。 相當於 unicode 的 \P{Nd},以及非 Unicode 行為的 [\^0-9]

支援Microsoft .NET Framework 正則表達式中可用的數量值,如下所示:

元素 描述
* 指定零個或多個符合的條件,例如,\w* (abc)*. 等同於 {0,}
+ 匹配前一個字元的重複實例。
? 指定零或一個匹配;例如,\w?(abc)?。 相當於 {0,1}
{n} 指定完全符合 n 的匹配數量,例如,(pizza){2}
{n,} 指定至少符合 n 的條件;例如,(abc){2,}
{n,m} 指定至少 n,但不超過 m的符合項目。