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 只能包含字符串的变量和一个 $dates 只能包含 DateTime 对象的变量。

[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 - 大写Letter
  • Ll - LowercaseLetter
  • Lt - TitlecaseLetter
  • Lm - ModifierLetter
  • Lo - OtherLetter
  • Nd - DecimalDigitNumber

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

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

  • 任何 Unicode 字符,但以下例外:
    • 右大括号 (}) 字符 (U+007D) 。
    • 反引号 (`) 字符 (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)}

若要引用包含大括号的变量名称,请将变量名称括在大括号中,并使用反引号字符对大括号进行转义。 例如,若要创建名为 type 的 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"

可以通过在文本编辑器(如 notepad.exe)中打开$PROFILE文件,将此命令添加到 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 更改变量的值。

另请参阅