共用方式為


5. 變數

編輯附註

重要

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 平臺的格式設定。 已修正某些錯字和次要錯誤。

變數代表值的儲存位置,而該值具有 型別。 傳統的程序設計語言是靜態類型的。也就是說,一個變數在編譯時期所宣告的類型就是它在執行時期的類型。 物件導向語言加入了繼承的概念,這使得變數的執行時期類型可以是編譯時宣告的類型,或者是從該類型衍生出的其他類型。 作為動態類型語言,PowerShell 的變數本身沒有類型。 事實上,變數不是預先定義的;當它們第一次被賦值時,它們就會變成存在。 雖然變數可能會受到限制(§5.3)以持有指定類型的值,但指派中的類型資訊不一定能靜態驗證。

在不同的時候,變數可能會透過指派(§7.11)或使用 ++‑‑ 運算子(§7.1.5, §7.2.6),與不同類型的值產生關聯。 當與變數相關聯的值變更時,該值的類型可能會變更。 例如

$i = "abc"        # $i holds a value of type string
$i = 2147483647   # $i holds a value of type int
++$i              # $i now holds a value of type double because
                  # 2147483648 is too big to fit in type int

未建立之變數的任何用法都會導致值$null。 若要查看變數是否已定義,請使用 Test-Path Cmdlet。

5.1 可寫入位置

可寫入的位置 是一個運算式,指定指令具有讀取和寫入權限的資源。 可寫入的位置可以是變數(•5)、陣列元素(•9)、哈希表中透過下標存取的關聯值(\10)、屬性(\7.1.2),或提供者管理的記憶體(\3.1)。

5.2 變數類別

PowerShell 會定義下列變數類別:靜態變數、實例變數、陣列元素、哈希表索引鍵/值組、參數、一般變數,以及提供者磁碟驅動器上的變數。 後續的子區段會描述每個類別。

在下列範例中

function F ($p1, $p2) {
    $radius = 2.45
    $circumference = 2 * ([Math]::PI) * $radius

    $date = Get-Date -Date "2010-2-1 10:12:14 pm"
    $month = $date.Month

    $values = 10, 55, 93, 102
    $value = $values[2]

    $h1 = @{ FirstName = "James"; LastName = "Anderson" }
    $h1.FirstName = "Smith"

    $Alias:A = "Help"
    $Env:MyPath = "E:\Temp"
    ${E:output.txt} = 123
    $Function:F = { "Hello there" }
    $Variable:v = 10
}
  • [Math::PI] 是靜態變數
  • $date.Month 是實例變數
  • $values[2] 是陣列元素
  • $h1.FirstNameHashtable 鍵值,其對應的值為 $h1['FirstName']
  • $p1$p2 為參數
  • $radius$circumference$date$month$values$value$h1 都是一般變數
  • $Alias:A$Env:MyPath${E:output.txt}$Function:F 是對應提供者磁碟驅動器上的變數。
  • $Variable:v 實際上是以其完全限定提供者路徑撰寫的一般變數。

5.2.1 靜態變數

屬於類型而不是該類型特定實例的物件資料成員,稱為 靜態變數。 如需一些範例,請參閱 §4.2.3§4.2.4.1,以及 §4.3.8

PowerShell 無法建立包含靜態變數的新類型;不過,這類類型的物件可能由主機環境提供。

用於建立和刪除包含靜態變數之物件的記憶體是由主機環境和垃圾收集系統所管理。

如需存取靜態變數的相關信息,請參閱 •7.1.2

靜態數據成員可以是欄位或屬性。

5.2.2 實例變數

屬於物件類型之特定實例的數據成員,而不是類型本身的數據成員,稱為 實例變數。 如需一些範例,請參閱 •4.3.14.3.3

PowerShell 主機環境可能會提供方法來建立包含實例變數的新類型,或將新的實例變數新增至現有類型。

用於建立和刪除包含靜態變數之物件的記憶體是由主機環境和垃圾收集系統所管理。

如需存取實例變數的相關資訊,請參閱 §7.1.2

實例數據成員可以是欄位或屬性。

5.2.3 陣列元素

陣列可以透過一元逗號運算符建立(§7.2.1),子表達式§7.1.6),陣列表達式§7.1.7)、二進制逗號運算符(§7.3)、範圍運算符(§7.4),或 New-Object Cmdlet。

用於建立和刪除陣列的記憶體是由主機環境和垃圾收集系統所管理。

陣列和陣列元素會在 :9中討論。

5.2.4 哈希表索引鍵/值組

哈希表是透過哈希常值 (\2.3.5.6) 或 New-Object Cmdlet 來建立。 您可以透過 [] 運算符來新增鍵/值對(§7.1.4.3)。

用於建立和刪除哈希表的記憶體是由主機環境和垃圾收集系統所管理。

哈希表在 節 10中討論。

5.2.5 參數

參數會在叫用其父命令時建立,並以叫用時或主機環境所提供的引數值初始化。 當參數的父命令終止時,參數就會停止存在。

參數會在 §8.10中討論。

5.2.6 一般變數

一般變數 是由 賦值運算式§7.11)或 foreach語句§8.4.4)來定義。 有些一些一般變數是由主機環境預先定義,而其他變數則是暫時性、在運行時間視需要來回進行。

一般變數的存留期是程序執行的一部分,在此期間,記憶體保證會保留給它。 此存留期會從與其相關聯的範圍開始進入,而且不會早於該範圍的執行結束結束。 如果父範圍以遞歸或反覆方式輸入,則每次都會建立局部變數的新實例。

一般變數所參考的記憶體會在不受該變數存留期影響的情況下回收。

一般變數可以使用 名稱空間前綴:§5.2.7)來明確命名。

5.2.7 提供者磁碟驅動器上的變數

提供者和驅動器的概念是在 §3.1中引進的,每個提供者都能夠提供自己的命名空間驅動器。 這可讓這些磁碟驅動器上的資源可以像一般變數一樣存取(§5.2.6)。 事實上,一般變數會儲存在文件系統提供者磁碟驅動器變數上:(\3.1.5),而且可以透過其一般名稱或其完整命名空間名稱來存取。

某些命名空間變數類型會隱含限制 (#•5.3)。

5.3 限制變數

根據預設,變數可以指定任何類型的值。 不過,變數可能會透過在指派或參數中將型別常值放在名稱之前的方法,來限制其指定某一型別的值。 例如

[int]$i = 10   # constrains $i to designating ints only
$i = "Hello"   # error, no conversion to int
$i = "0x10"    # ok, conversion to int
$i = $true     # ok, conversion to int

function F ([int]$p1, [switch]$p2, [regex]$p3) { ... }

屬於命名空間 Env:別名:,或檔案系統命名空間(§2.3.2§3.1)的任何變數都會隱含地限制為類型 string。 屬於命名空間 函數§2.3.2§3.1)的任何變數會隱含地限制為類型 scriptblock