about_Variables

简短说明

描述变量如何存储可在 PowerShell 中使用的值。

长说明

可以在 PowerShell 变量中存储所有类型的值。 例如,存储命令的结果,并存储命令和表达式中使用的元素,例如名称、路径、设置和值。

变量是存储值的内存单元。 在 PowerShell 中,变量由以美元符号 ($) 开头的文本字符串表示,例如 $a$process$my_var

变量名称不区分大小写,可以包含空格和特殊字符。 但是,包含特殊字符和空格的变量名称不易使用,应避免使用。 有关详细信息,请参阅包含特殊字符的变量名称

PowerShell 中有几种不同类型的变量。

  • 用户创建的变量:用户创建的变量由用户创建和维护。 默认情况下,在 PowerShell 命令行中创建的变量仅在 PowerShell 窗口打开时存在。 关闭 PowerShell 窗口后,将删除变量。 若要保存变量,请将其添加到 PowerShell 配置文件。 还可以在具有全局、脚本或本地范围的脚本中创建变量。

  • 自动变量:自动变量存储 PowerShell 的状态。 这些变量由 PowerShell 创建,PowerShell 会根据需要更改其值,以保持其准确性。 用户无法更改这些变量的值。 例如,$PSHOME 变量存储 PowerShell 安装目录的路径。

    有关详细信息、列表和自动变量的说明,请参阅 about_Automatic_Variables

  • 首选项变量:首选项变量存储 PowerShell 的用户首选项。 这些变量由 PowerShell 创建,并使用默认值填充。 用户可以更改这些变量的值。 例如,该 $MaximumHistoryCount 变量会确定会话历史记录中的最大条目数。

    有关详细信息、列表和首选项变量的说明,请参阅 about_Preference_Variables

使用变量

若要创建新变量,请使用赋值语句向变量赋值。 在使用变量之前,无需声明变量。 所有变量的默认值均为 $null

若要获取 PowerShell 会话中所有变量的列表,请键入 Get-Variable。 在显示变量名时,前面的美元 ($) 符号将不被用来引用变量。

例如:

$MyVariable = 1, 2, 3

$Path = "C:\Windows\System32"

变量可用于存储命令的结果。

例如:

$Processes = Get-Process

$Today = (Get-Date).DateTime

若要显示变量的值,请键入变量名称,前面带美元符号 ($)。

例如:

$MyVariable
1
2
3
$Today
Tuesday, September 3, 2019 09:46:46

若要更改变量的值,请将新值分配给变量。

以下示例显示 $MyVariable 变量的值,更改变量的值,然后显示新值。

$MyVariable = 1, 2, 3
$MyVariable
1
2
3
$MyVariable = "The green cat."
$MyVariable
The green cat.

若要删除变量的值,请使用 Clear-Variable cmdlet 或将该值更改为 $null

Clear-Variable -Name MyVariable
$MyVariable = $null

若要删除变量,请使用 Remove-VariableRemove-Item

Remove-Variable -Name MyVariable
Remove-Item -Path Variable:\MyVariable

还可以使用一个语句将值分配给多个变量。 以下示例将相同的值分配给多个变量:

$a = $b = $c = 0

下一示例将多个值分配给多个变量。

$i,$j,$k = 10, "red", $true    # $i is 10, $j is "red", $k is True
$i,$j = 10, "red", $true       # $i is 10, $j is [object[]], Length 2

有关详细信息,请参阅 about_Assignment_Operators分配多个变量部分。

变量类型

可以将任何类型的对象存储在变量中,包括整数、字符串、数组和哈希表。 以及表示进程、服务、事件日志和计算机的对象。

PowerShell 变量是松散类型的,这意味着它们不限于特定类型的对象。 单个变量甚至可以同时包含不同类型的对象的集合或数组。

变量的数据类型由变量值的 .NET 类型确定。 若要查看变量的对象类型,请使用 Get-Member

例如:

$a = 12                         # System.Int32
$a = "Word"                     # System.String
$a = 12, "Word"                 # array of System.Int32, System.String
$a = Get-ChildItem C:\Windows   # FileInfo and DirectoryInfo types

可以使用类型属性和强制转换表示法来确保变量只能包含可转换为该类型的特定对象类型或对象。 如果尝试分配另一种类型的值,PowerShell 会尝试将值转换为其类型。 如果无法转换类型,则赋值语句将失败。

若要使用强制转换表示法,请在变量名称(位于赋值语句左侧)之前输入一个括在括号中的类型名称。 以下示例会创建一个 $number 变量,该变量只能包含整数、一个只能包含字符串的 $words 变量,以及只能包含 DateTime 对象的 $dates 变量。

[int]$number = 8
$number = "12345"  # The string is converted to an integer.
$number = "Hello"
Cannot convert value "Hello" to type "System.Int32". Error: "Input string
was not in a correct format."
At line:1 char:1
+ $number = "Hello"
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo          : MetadataError: (:) [],
    ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
[string]$words = "Hello"
$words = 2       # The integer is converted to a string.
$words += 10     # The plus (+) sign concatenates the strings.
$words
210
[datetime] $dates = "09/12/91"  # The string is converted to a DateTime object.
$dates
Thursday, September 12, 1991 00:00:00
$dates = 10    # The integer is converted to a DateTime object.
$dates
Monday, January 1, 0001 00:00:00

在命令和表达式中使用变量

若要在命令或表达式中使用变量,请在美元 ($) 符号前键入变量名称。

如果变量名称和美元符号未用引号引起来,或者用双引号 (") 标记将它们括起来,则变量的值将用在命令或表达式中。

如果变量名称和美元符号括在单引号 (') 标记中,则变量名称将用于表达式中。

有关使用 PowerShell 中的引号的详细信息,请参阅about_Quoting_Rules

此示例获取 $PROFILE 变量的值,该变量是 PowerShell 控制台中 PowerShell 用户配置文件文件的路径。

$PROFILE
C:\Users\User01\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

在此示例中,显示了两个命令,可在 notepad.exe中打开 PowerShell 配置文件。 带双引号 (") 标记的示例使用变量的值。

notepad $PROFILE

notepad "$PROFILE"

以下示例使用将变量视为文本文本的单引号 (') 标记。

'$PROFILE'
$PROFILE
'Use the $PROFILE variable.'
Use the $PROFILE variable.

包含特殊字符的变量名称

变量名称以美元 ($) 符号开头,可以包含字母数字字符和特殊字符。 变量名称长度仅受可用内存的限制。

最佳做法是变量名称仅包含字母数字字符和下划线 (_) 字符。 包含空格和其他特殊字符的变量名称不易使用,应避免使用。

字母数字变量名称可以包含以下字符:

  • 这些类别中的 Unicode 字符:LuLlLtLmLoNd
  • 或下划线 (_) 字符。
  • 问号 (?) 字符。

以下列表包含 Unicode 类别说明。 有关详细信息,请参阅 UnicodeCategory

  • Lu - UppercaseLetter
  • Ll - LowercaseLetter
  • Lt - TitlecaseLetter
  • Lm - ModifierLetter
  • Lo - OtherLetter
  • Nd - DecimalDigitNumber

若要创建或显示包含空格或特殊字符的变量名称,请使用大括号 ({}) 字符将变量名称括起来。 大括号指示 PowerShell 将变量名称的字符解释为文本。

特殊字符变量名称可以包含以下字符:

  • 任何 Unicode 字符,但有以下例外情况:
    • 右大括号 (}) 字符 (U+007D)。
    • The backtick (`) character (U+0060). 反引号用于转义 Unicode 字符,以便将其视为文本。

PowerShell 具有保留变量,例如包含字母数字和特殊字符的 $$$?$^ 以及 $_。 有关详细信息,请参阅 about_Automatic_Variables

例如,以下命令创建名为 save-items 的变量。 需要大括号 ({}),因为变量名称包括连字符 (-) 特殊字符。

${save-items} = "a", "b", "c"
${save-items}
a
b
c

以下命令获取由 ProgramFiles(x86) 环境变量表示的目录中的子项。

Get-ChildItem ${env:ProgramFiles(x86)}

若要引用包含大括号的变量名称,请将变量名称括在大括号中,并使用反引号字符对大括号进行转义。 例如,若要创建名为 this{value}is 类型的变量:

${this`{value`}is} = "This variable name uses braces and backticks."
${this`{value`}is}
This variable name uses braces and backticks.

变量和范围

默认情况下,变量仅在创建变量的范围中可用。

例如,在函数中创建的变量仅在函数中可用。 在脚本中创建的变量仅在脚本中可用。 如果脚本使用点源,则会将变量添加到当前范围。 有关详细信息,请参阅 about_Scopes

可以使用范围修饰符更改变量的默认作用域。 以下表达式会创建一个名为 Computers。 该变量具有全局范围,即使在脚本或函数中创建该变量也是如此。

$Global:Computers = "Server01"

对于从会话外执行的任何脚本或命令,需要 Using 范围修饰符从调用会话范围嵌入变量值,以便会话外代码可以访问它们。

有关详细信息,请参阅 about_Remote_Variables

保存变量

创建的变量仅可在创建它们的会话中使用。 关闭会话时,它们会丢失。

若要在启动的每个 PowerShell 会话中创建变量,请将变量添加到 PowerShell 配置文件。

例如,若要更改每个 PowerShell 会话中 $VerbosePreference 变量的值,请将以下命令添加到 PowerShell 配置文件。

$VerbosePreference = "Continue"

可以通过在文本编辑器中打开 $PROFILE 文件(例如 notepad.exe),将此命令添加到 PowerShell 配置文件。 有关 PowerShell 配置文件的详细信息,请参阅 About_Profiles

变量:驱动器

PowerShell 变量提供程序会创建 Variable: 驱动器,该驱动器的外观和作用类似于文件系统驱动器,但它包含会话中的变量及其值。

若要更改为 Variable: 驱动器,请使用以下命令:

Set-Location Variable:

若要列出驱动器中的 Variable: 项和变量,请使用 Get-ItemGet-ChildItem cmdlet。

Get-ChildItem Variable:

若要获取特定变量的值,请使用文件系统表示法指定驱动器的名称和变量的名称。 例如,若要获取 $PSCulture 自动变量,请使用以下命令。

Get-Item Variable:\PSCulture
Name                           Value
----                           -----
PSCulture                      en-US

若要显示有关 Variable: 驱动器和 PowerShell 变量提供程序的详细信息,请键入:

Get-Help Variable

具有提供程序路径的变量语法

可以使用美元 ($) 符号为提供程序路径添加前缀,并访问实现 IContentCmdletProvider 接口的任何提供程序的内容。

以下内置 PowerShell 提供程序支持此表示法:

变量 cmdlet

PowerShell 包含一组旨在管理变量的 cmdlet。

若要列出 cmdlet,请键入:

Get-Command -Noun Variable

若要获取特定 cmdlet 的帮助,请键入:

Get-Help <cmdlet-name>
cmdlet 名称 说明
Clear-Variable 删除变量的值。
Get-Variable 获取当前控制台中的变量。
New-Variable 创建新变量。
Remove-Variable 删除变量及其值。
Set-Variable 更改变量的值。

另请参阅