2. 词法结构
编辑说明
重要
Windows PowerShell 语言规范 3.0 于 2012 年 12 月发布,基于 Windows PowerShell 3.0。 此规范不反映 PowerShell 的当前状态。 没有计划更新本文档以反映当前状态。 此处提供了本文档供历史参考。
该规范文档可作为 Microsoft Word 文档从 Microsoft 下载中心获取:https://www.microsoft.com/download/details.aspx?id=36389。该 Word 文档已转换并在 Microsoft Learn 上展示。 转换期间,进行了一些编辑更改,以适应 Docs 平台的格式设置。 已更正某些拼写错误和次要错误。
2.1 语法
此规范使用两种语法显示 PowerShell 语言的语法。 词法语法(§B.1)显示 Unicode 字符如何组合成行终止符、注释、空格和标记。 句法语法(§B.2)展示了词法语法生成的标记如何组合形成 PowerShell 脚本。
为了方便,本规范在适当位置重复了这些语法的片段。
语法中字符“a”到“z”的任何用法都不区分大小写。 这意味着将忽略变量、别名、函数名称、关键字、语句和运算符中的字母大小写。 但是,在整个规范中,此类名称以小写形式编写,但某些自动变量和首选项变量除外。
2.2 词法分析
2.2.1 脚本
语法:
提示
语法定义中的 ~opt~
表示法指示词法实体在语法中是可选的。
input:
input-elements~opt~ signature-block~opt~
input-elements:
input-element
input-elements input-element
input-element:
whitespace
comment
token
signature-block:
signature-begin signature signature-end
signature-begin:
new-line-character # SIG # Begin signature block new-line-character
signature:
base64 encoded signature blob in multiple single-line-comments
signature-end:
new-line-character # SIG # End signature block new-line-character
描述:
PowerShell 翻译器的输入源数据流是脚本中的输入,其中包含 Unicode 字符序列。 此流的词法处理涉及将这些字符转化为一系列标记,继而成为语法分析的输入。
脚本是存储在 脚本文件中的一组 PowerShell 命令。 脚本本身没有名称,而是从源文件中获取名称。 该文件的末尾指示脚本的末尾。
脚本可以选择包含数字签名。 无需主机环境来处理签名后的任何文本或类似于签名的任何内容。 此规范未涵盖数字签名的创建和使用。
2.2.2 行结束符
语法:
new-line-character:
Carriage return character (U+000D)
Line feed character (U+000A)
Carriage return character (U+000D) followed by line feed character (U+000A)
new-lines:
new-line-character
new-lines new-line-character
描述:
输入源流中存在的新行字符将其划分为多行,便于进行如错误报告和检测单行注释结尾等操作。
行终止符可以被视为空白(§2.2.4)。
2.2.3 注释
语法:
comment:
single-line-comment
requires-comment
delimited-comment
single-line-comment:
# input-characters~opt~
input-characters:
input-character
input-characters input-character
input-character:
Any Unicode character except a new-line-character
requires-comment:
#requires whitespace command-arguments
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
dashdash:
dash dash
delimited-comment:
< # delimited-comment-text~opt~ hashes >
delimited-comment-text:
delimited-comment-section
delimited-comment-text delimited-comment-section
delimited-comment-section:
>
hashes~opt~ not-greater-than-or-hash
hashes:
#
hashes #
not-greater-than-or-hash:
Any Unicode character except > or #
描述:
源代码可以使用注释进行批注。
单行注释以字符 #
开头,以新行字符结尾。
带分隔符的注释以字符对 <#
开头,以字符对 #>
结尾。
它可以作为源行的一部分出现,或作为整个源行出现,也可以跨越多个源行。
注释被视为空白。
上述生产暗示
- 注释不嵌套。
- 字符序列 <# 和 #> 在单行注释中没有特殊含义。
- 字符 # 在带分隔符的注释中没有特殊含义。
词法语法意味着注释不能出现在标记内。
(请参阅 §A,了解如何创建包含用于从脚本文件生成文档的特殊值注释的脚本文件。
需要注释指定其包含脚本运行必须满足的条件。 主要条件是用于运行脚本的 PowerShell 版本。 最低版本要求如下所述:
#requires -Version N[.n]
其中,N 是主版本(必需),n 是次要版本(可选)。
需要注释可以存在于任何脚本文件中,但是,它不能存在于函数或 cmdlet 中。 它必须是源行上的第一项。 脚本可以包含多个要求注释。
仅当序列以 #
或 <#
开头时,字符序列才被识别为注释。 例如,hello#there 被视为单个令牌,而 hello #there 被视为令牌 hello,后跟单行注释。 在空格之后,注释开始序列也可以以任何表达式终止符或语句终止字符(如 )
、}
、]
、'
、"
或 ;
)开头。
需要注释不能存在于管理单元内。
有四种其他形式的需要注释:
#requires --Assembly AssemblyId
#requires --Module ModuleName
#requires --PsSnapIn PsSnapIn [ -Version *N* [.n] ]
#requires --ShellId ShellId
2.2.4 空白
语法:
whitespace:
Any character with Unicode class Zs, Zl, or Zp
Horizontal tab character (U+0009)
Vertical tab character (U+000B)
Form feed character (U+000C)
` (The backtick character U+0060) followed by new-line-character
描述:
空白区域 由一个或多个 空白字符 的任意序列组成。
除了空白可以作为令牌分隔符之外,它将被忽略。
与某些常用语言不同,PowerShell 不会将行终止符字符(§2.2.2)视为空白。 但是,行终止符可以通过紧接反撇号字符 `
(U+0060) 而视为空白。 当一行的内容在语法上已经完整时,这是必需的,但以下一行包含旨在与上一行关联的语法符号。 例如,
$number = 10 # assigns 10 to $number; nothing is written to the pipeline
+ 20 # writes 20 to the pipeline
- 50 # writes -50 to the pipeline
$number # writes $number's value, 10, to the pipeline
在此示例中,反撇号指示源行仍在继续。 以下表达式等效于 $number = 10 + 20 - 50
。
$number = 10 `
+ 20 `
- 50
$number # writes $number's value to the pipeline
-20
2.3 令牌
语法:
token:
keyword
variable
command
command-parameter
command-argument-token
integer-literal
real-literal
string-literal
type-literal
operator-or-punctuator
描述:
令牌 是 PowerShell 语言中最小的词法元素。
令牌可以通过新行、注释、空格或其任意组合分隔。
2.3.1 关键字
语法:
keyword: one of
begin break catch class
continue data define do
dynamicparam else elseif end
exit filter finally for
foreach from function if
in inlinescript parallel param
process return switch throw
trap try until using
var while workflow
描述:
关键字 是一系列字符,在上下文相关位置使用时具有特殊含义。 通常,这是 语句中的第一个标记;但是,还有其他位置,如语法所示。 (类似于关键字但未在关键字上下文中使用的标记是 命令名称 或 命令参数.)
关键字 class
、define
、from
、using
和 var
保留供将来使用。
注意
编辑器说明:PowerShell 5.0 中引入了 class
和 using
关键字。 请参阅 about_Classes 和 about_Using。
2.3.2 变量
语法:
variable:
$$
$?
$^
$ variable-scope~opt~ variable-characters
@ variable-scope~opt~ variable-characters
braced-variable
braced-variable:
${ variable-scope~opt~ braced-variable-characters }
variable-scope:
global:
local:
private:
script:
using:
workflow:
variable-namespace
variable-namespace:
variable-characters :
variable-characters:
variable-character
variable-characters variable-character
variable-character:
A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nd
_ (The underscore character U+005F)
?
braced-variable-characters:
braced-variable-character
braced-variable-characters braced-variable-character
braced-variable-character:
Any Unicode character except
} (The closing curly brace character U+007D)
` (The backtick character U+0060)
escaped-character
escaped-character:
` (The backtick character U+0060) followed by any Unicode character
描述:
变量在 (§5) 中进行了详细讨论。 变量 $? 在 §2.3.2.2 中进行了讨论。 §3.5中讨论了范围。
$$
和 $^
变量保留用于交互式环境,该环境超出了此规范的范围。
编写变量名称的方法有两种:大括号变量名称,以 $
开头,后跟一组用大括号分隔的一个或多个几乎任意字符;和普通变量名称,该名称也以 $
开头,后跟一组字符,这些字符比大括号变量名称的字符集更为严格。 每个普通变量名称都可以使用相应的大括号变量名称来表示。
$totalCost
$Maximum_Count_26
$végösszeg # Hungarian
$итог # Russian
$総計 # Japanese (Kanji)
${Maximum_Count_26}
${Name with`twhite space and `{punctuation`}}
${E:\\File.txt}
变量名称的长度没有限制,变量名称中的所有字符都很重要,并且字母大小写 不 不同。
有多种不同类型的变量:用户定义的(§2.3.2.1)、自动(§2.3.2.2)和首选项(§2.3.2.3)。 它们都可以在同一范围内共存(§3.5)。
请考虑以下函数定义和调用:
function Get-Power ([long]$base, [int]$exponent) { ... }
Get-Power 5 3 # $base is 5, $exponent is 3
Get-Power -exponent 3 -base 5 # " " "
每个参数按位置或名称传递,一次一个。 但是,可以将一组参数作为一个组进行传递,该组扩展为运行时环境正在处理的单个参数。 此自动参数扩展称为展开。 例如,
$values = 5,3 # put arguments into an array
Get-Power @values
$hash = @{ exponent = 3; base = 5 } # put arguments into a Hashtable
Get-Power @hash
function Get-Power2 { Get-Power @args } # arguments are in an array
Get-Power2 --exponent 3 --base 5 # named arguments splatted named in
@args
Get-Power2 5 3 # position arguments splatted positionally in @args
这是通过使用 @
而不是 $
作为要传递的变量的第一个字符来实现的。
此表示法只能在命令的参数中使用。
名称分区为各种命名空间,每个命名空间存储在虚拟驱动器上(§3.1)。 例如,变量存储在 Variable:
上,环境变量存储在 Env:
上,函数存储在 Function:
上,别名存储在 Alias:
上。 所有这些名称都可以作为变量访问,需在变量范围内,使用变量命名空间生成。 例如,
function F { "Hello from F" }
$Function:F # invokes function F
Set-Alias A F
$Alias:A # invokes function F via A
$Count = 10
$Variable:Count # accesses variable Count
$Env:Path # accesses environment variable Path
对具有显式 Variable:
命名空间的变量名称的任何使用都等效于使用该同一变量名而不具有该限定。 例如,$v
和 $Variable:v
可互换。
除了用语言定义,变量也可以由 cmdlet New-Variable定义。
2.3.2.1 用户定义的变量
语法允许但不由自动变量或首选项变量使用的任何变量名称都可用于用户定义的变量。
用户定义的变量由用户定义的脚本创建和管理。
2.3.2.2 自动变量
自动变量存储有关 PowerShell 环境的状态信息。 可以在用户写入的脚本中读取其值,但不能写入。
注意
本文档中最初找到的表已被删除,以减少重复。 有关自动变量的完整列表,请参阅 about_Automatic_Variables。
2.3.2.3 首选项变量
首选项变量存储会话的用户首选项。 它们由 PowerShell 运行时环境创建和初始化。 可以使用用户编写的脚本读取和写入其值。
注意
本文档中最初找到的表已被删除,以减少重复。 有关首选项变量的完整列表,请参阅 about_Preference_Variables。
2.3.3 命令
语法:
generic-token:
generic-token-parts
generic-token-parts:
generic-token-part
generic-token-parts generic-token-part
generic-token-part:
expandable-string-literal
verbatim-here-string-literal
variable
generic-token-char
generic-token-char:
Any Unicode character except
{ } ( ) ; , | & $
` (The backtick character U+0060)
double-quote-character
single-quote-character
whitespace
new-line-character
escaped-character
generic-token-with-subexpr-start:
generic-token-parts $(
2.3.4 参数
语法:
command-parameter:
dash first-parameter-char parameter-chars colon~opt~
first-parameter-char:
A Unicode character of classes Lu, Ll, Lt, Lm, or Lo
_ (The underscore character U+005F)
?
parameter-chars:
parameter-char
parameter-chars parameter-char
parameter-char:
Any Unicode character except
{ } ( ) ; , \| & . [
colon
whitespace
new-line-character
colon:
: (The colon character U+003A)
verbatim-command-argument-chars:
verbatim-command-argument-part
verbatim-command-argument-chars verbatim-command-argument-part
verbatim-command-argument-part:
verbatim-command-string
& non-ampersand-character
Any Unicode character except
|
new-line-character
non-ampersand-character:
Any Unicode character except &
verbatim-command-string:
double-quote-character non-double-quote-chars
double-quote-character
non-double-quote-chars:
non-double-quote-char
non-double-quote-chars non-double-quote-char
non-double-quote-char:
Any Unicode character except
double-quote-character
描述:
调用命令时,可以通过一个或多个 参数将信息传递给它, 通过一组相应的 参数从命令内访问其值。 参数与参数值匹配的过程称为参数绑定。
有三种论点:
交换机参数 (§8.10.5) - 这是命令参数的形式,其中 first-parameter-char 和 parameter-chars 组成交换机名称,该名称对应于调用的命令中参数的名称(没有其前导
-
)。 如果省略尾冒号,则此参数的存在指示相应的参数设置为$true
。 如果存在尾随冒号,紧随其后的参数必须用一个布尔类型的值来指定,并且对应的参数被设置为该值。 例如,以下调用等效:Set-MyProcess -Strict Set-MyProcess -Strict: $true
包含参数的参数 (§8.10.2) - 这是命令参数的形式,其中 first-parameter-char 和 parameter-chars 组成参数名称,该名称对应于调用的命令中参数的名称(没有其前导 -)。 不得有尾随冒号。 紧接着的参数指定关联的值。 例如,如果命令
Get-Power
具有参数$base
和$exponent
,则以下调用是等效的:Get-Power -base 5 -exponent 3 Get-Power -exponent 3 -base 5
位置参数(§8.10.2) - 参数及其相应的参数在命令内具有位置,第一个位置为零。 位置 0 中的参数绑定到位置 0 中的参数;位置 1 中的参数绑定到位置 1 中的参数;等等。 例如,给定一个命令
Get-Power
,该命令分别在位置 0 和 1 中具有参数$base
和$exponent
,以下命令将调用该命令:Get-Power 5 3
有关特殊参数 --
和 --%
的详细信息,请参阅 §8.2。
调用命令时,参数名称可以缩写;只要同一命令接受的其他参数名称中不存在模棱两可的情况,就可以使用全名的任何明确的前导部分。
有关参数绑定的信息,请参阅 §8.14。
2.3.5 字面量
语法:
literal:
integer-literal
real-literal
string-literal
2.3.5.1 数值
有两种类型的数值字面量:整数(§2.3.5.1.1)和实数(§2.3.5.1.2)。 两者都可以具有乘数后缀(§2.3.5.1.3)。
2.3.5.1.1 整数文本
语法:
integer-literal:
decimal-integer-literal
hexadecimal-integer-literal
decimal-integer-literal:
decimal-digits numeric-type-suffix~opt~ numeric-multiplier~opt~
decimal-digits:
decimal-digit
decimal-digit decimal-digits
decimal-digit: one of
0 1 2 3 4 5 6 7 8 9
numeric-type-suffix:
long-type-suffix
decimal-type-suffix
hexadecimal-integer-literal:
0x hexadecimal-digits long-type-suffix~opt~
numeric-multiplier~opt~
hexadecimal-digits:
hexadecimal-digit
hexadecimal-digit decimal-digits
hexadecimal-digit: one of
0 1 2 3 4 5 6 7 8 9 a b c d e f
long-type-suffix:
l
numeric-multiplier: one of
kb mb gb tb pb
描述:
整数值的类型由其值、是否存在long 类型后缀以及数值乘数 (§2.3.5.1.3) 确定。
对于没有 long 类型后缀 的整数文本
- 如果其值可由 int 类型表示(§4.2.3),则为其类型;
- 否则,如果其值可由类型 long(§4.2.3)表示,则为其类型。
- 否则,如果其值可由类型十进制(§2.3.5.1.2)表示,则为其类型。
- 否则,它用 double类型表示 (§2.3.5.1.2)。
对于有 long 类型后缀 的整数文本
- 如果其值可以由 long 类型表示(§4.2.3),则为其类型;
- 否则,该文本的格式不正确。
在整数值的二进制补码表示形式中,负值比正值多一个 对于 int 类型,该额外值为 -2147483648。 对于长类型,该额外值为 -9223372036854775808。 尽管令牌 2147483648 通常被视为 long 类型的文本,但如果一元运算符紧跟其后,则该运算符和文本将被视为具有最小值的 int 类型文本。 与之类似,尽管令牌 9223372036854775808 通常被视为 decimal 类型的真实文本,但如果一元运算符紧跟其后,则该运算符和文本将被视为具有最小值的 long 类型文本。
整数文本的一些示例包括 123(int)、123L(long)和 20000000000(long)。
没有 byte 类型的整数文本。
2.3.5.1.2 真实文本
语法:
real-literal:
decimal-digits . decimal-digits exponent-part~opt~ decimal-type-suffix~opt~ numeric-multiplier~opt~
. decimal-digits exponent-part~opt~ decimal-type-suffix~opt~ numeric-multiplier~opt~
decimal-digits exponent-part decimal-type-suffix~opt~ numeric-multiplier~opt~
exponent-part:
e sign~opt~ decimal-digits
sign: one of
+
dash
decimal-type-suffix:
d
l
numeric-multiplier: one of
kb mb gb tb pb
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
描述:
真实文本可能包含数值乘数 (§2.3.5.1.3)。
有两种类型的真实文本:double 和 decimal。 这些分别由 小数类型后缀的缺失或存在来指示。 (不存在浮点真实文本。)
double 真实文本的类型为 double (§4.2.4.1)。 decimal 真实文本的类型为 decimal (§4.2.4.2)。 十进制真实文本的小数部分中的尾随零很重要。
如果双实文本中 指数部分小数位数 的值小于支持的最小值,则双实文本的值为 0。 如果十进制真实文本中 指数部分的小数位数的值小于所支持的最低值,则该文本格式不正确。 如果 double 或 decimal 真实文本中 指数部分的小数位数的值小于所支持的最低值,则该文本格式不正确。
double 真实文本的一些示例包括 1.、1.23、.45e35、32.e+12 和 123.456E-231。
小数实数文字的一些示例包括 1d(小数位数为 0)、1.20d(小数位数为 2)、1.23450e1d(即,12.3450,小数位数为 4)、1.2345e3d(即,1234.5,小数位数为 1)、1.2345e-1d(即 0.12345,小数位数为 5)和 1.2345e-3d(即 0.0012345,小数位数为 7)。
注意
由于 double 真实文本不必包含分数或指数部分,因此在 (123).M 中需要使用括号,以确保针对值为 123 的整数对象选择属性或方法 M。 如果没有这些括号,真实文本将格式不正确。
注意
尽管 PowerShell 不为无穷大和 NaN 提供文本,但可以从类型 float 和 double 的静态只读属性 PositiveInfinity、NegativeInfinity 和 NaN (§4.2.4.1) 中获取 double 真实文本类等效项。
语法允许以 double 真实文本开头的内容具有 l
或 L
类型后缀。 此类令牌实际上是一个整数文本,其值由 long 类型表示。
注意
此功能已保留,以便与早期版本的 PowerShell 向后兼容。 但是,不建议程序员使用这种形式的整数文本,因为它们很容易掩盖文本的实际值。 例如,1.2L 具有值 1,1.2345e1L 的值为 12,1.2345e-5L 的值为 0,这一点并不明显。
2.3.5.1.3 乘数后缀
语法:
numeric-multiplier: *one of*
kb mb gb tb pb
描述:
为方便起见,整数和实数文本可以包含一个数字乘数,表示一组常用的 10 的幂中的一个。 数字乘数 可以采用大写或小写字母的任意组合编写。
乘数 | 含义 | 示例 |
---|---|---|
kb | 千字节 (1024) | 1kb ≡ 1024 |
mb | 兆字节 (1024 x 1024) | 1.30Dmb ≡ 1363148.80 |
gb | 千兆字节 (GB) (1024 x 1024 x 1024) | 0x10Gb ≡ 17179869184 |
tb | 兆字节 (1024 x 1024 x 1024 x 1024) | 1.4e23tb ≡ 1.5393162788864E+35 |
pb | 拍字节 (1024 x 1024 x 1024 x 1024 x 1024) | 0x12Lpb ≡ 20266198323167232 |
2.3.5.2 字符串文本
语法:
string-literal:
expandable-string-literal
expandable-here-string-literal
verbatim-string-literal
verbatim-here-string-literal
expandable-string-literal:
double-quote-character expandable-string-characters~opt~ dollars~opt~ double-quote-character
double-quote-character:
" (U+0022)
Left double quotation mark (U+201C)
Right double quotation mark (U+201D)
Double low-9 quotation mark (U+201E)
expandable-string-characters:
expandable-string-part
expandable-string-characters
expandable-string-part
expandable-string-part:
Any Unicode character except
$
double-quote-character
` (The backtick character U+0060)
braced-variable
$ Any Unicode character except
(
{
double-quote-character
` (The backtick character U+0060)*
$ escaped-character
escaped-character
double-quote-character double-quote-character
dollars:
$
dollars $
expandable-here-string-literal:
@ double-quote-character whitespace~opt~ new-line-character
expandable-here-string-characters~opt~ new-line-character double-quote-character @
expandable-here-string-characters:
expandable-here-string-part
expandable-here-string-characters expandable-here-string-part
expandable-here-string-part:
Any Unicode character except
$
new-line-character
braced-variable
$ Any Unicode character except
(
new-line-character
$ new-line-character Any Unicode character except double-quote-char
$ new-line-character double-quote-char Any Unicode character except @
new-line-character Any Unicode character except double-quote-char
new-line-character double-quote-char Any Unicode character except @
expandable-string-with-subexpr-start:
double-quote-character expandable-string-chars~opt~ $(
expandable-string-with-subexpr-end:
double-quote-char
expandable-here-string-with-subexpr-start:
@ double-quote-character whitespace~opt~ new-line-character expandable-here-string-chars~opt~ $(
expandable-here-string-with-subexpr-end:
new-line-character double-quote-character @
verbatim-string-literal:
single-quote-character verbatim-string-characters~opt~ single-quote-char
single-quote-character:
' (U+0027)
Left single quotation mark (U+2018)
Right single quotation mark (U+2019)
Single low-9 quotation mark (U+201A)
Single high-reversed-9 quotation mark (U+201B)
verbatim-string-characters:
verbatim-string-part
verbatim-string-characters verbatim-string-part
verbatim-string-part:
*Any Unicode character except* single-quote-character
single-quote-character single-quote-character
verbatim-here-string-literal:
@ single-quote-character whitespace~opt~ new-line-character
verbatim-here-string-characters~opt~ new-line-character
single-quote-character *@*
verbatim-*here-string-characters:
verbatim-here-string-part
verbatim-here-string-characters verbatim-here-string-part
verbatim-here-string-part:
Any Unicode character except* new-line-character
new-line-character Any Unicode character except single-quote-character
new-line-character single-quote-character Any Unicode character except @
描述:
有四种类型的字符串文本:
逐字字符串文本(单行单引号),它是由一对单引号字符分隔的零个或多个字符序列。 示例为 '' 和 'red'。
可展开字符串文本(单行双引号),这是由一对双引号字符分隔的零个或多个字符序列。 示例为 "" 和 "red"。
逐字显示字符串文本(多行单引号),这是一个由零个或多个字符组成的序列,这些字符通过字符对 @单引号字符 和 单引号字符@ 分隔,分别包含在两个或多个源行上。 示例包括:
@' '@ @' line 1 '@ @' line 1 line 2 '@
可展开显示字符串文本(多行双引号),这是一个由零个或多个字符组成的序列,这些字符通过字符对 @双引号字符 和 双引号字符@ 分隔,分别包含在两个或多个源行上。 示例包括:
@" "@ @" line 1 "@ @" line 1 line 2 "@
对于逐字显示字符串文本和可展开显示字符串文本,除了空格(将被忽略)之外,任何字符都不能与开头定界符字符对位于同一源行,并且不能在与结尾定界符字符对位于同一源行。
逐字显示字符串文本 或 可展开显示字符串文本的正文从首个源行的开头开始,在结束分隔符前最后一个源行的末尾结束。 该正文可能为空。 结束分隔符前面的最后一个源行的行终止符不是该文本正文的一部分。
任何这些类型的文本均为 string 类型 (§4.3.1)。
用于分隔逐字显示字符串文本或可展开字符串文本的字符,当需要在字符串中包含该字符时,可以通过连续写入两次来实现。 例如,'What''s the time?'
和 "I said, ""Hello""."
。 但是,单引号字符 在 可展开字符串文本内没有特殊含义,双引号字符 在 逐字字符串文本中没有特殊含义。
可展开字符串文本和可展开显示字符串文本可能包含转义字符 (§2.3.7)。 例如,将以下字符串文本写入管道时,结果如下所示:
"column1`tcolumn2`nsecond line, `"Hello`", ```Q`5`!"
column1<horizontal-tab>column2<new-line>
second line, "Hello", `Q5!
如果可展开字符串文本或可展开显示字符串文本包含变量的名称,除非该名称前面紧接着一个转义字符,否则它将被变量值的字符串表示形式替代 (§6.7)。 这称为变量替换。
注释
如果变量名称是某些较大表达式的一部分,则仅替换变量名称。 例如,如果 $a
是包含元素 100 和 200 的数组,则 ">$a.Length<"
结果 >100 200.Length<
,而 ">$($a.Length)<"
结果 >2<
。 请参阅下面的子表达式扩展。
例如,源代码
$count = 10
"The value of `$count is $count"
生成可展开字符串文本
The value of $count is 10.
请考虑以下事项:
$a = "red","blue"
"`$a[0] is $a[0], `$a[0] is $($a[0])" # second [0] is taken literally
结果为
$a[0] is red blue[0], $a[0] is red
可展开字符串文本和可展开显示字符串文本还支持一种称为 子表达式展开的替换,即将 $( ... )
格式的文本视为子表达式 (§7.1.6)。 此类文本将替换为该表达式值的字符串表示形式(§6.8)。 在构造结果字符串时,在 子表达式中用于分隔标记的任何空格都会被忽略,即使它们在的 语句列表 中存在。
示例,
$count = 10
"$count + 5 is $($count + 5)"
"$count + 5 is `$($count + 5)"
"$count + 5 is `$(`$count + 5)"
生成如下所示的可展开字符串文本项:
10 + 5 is 15
10 + 5 is $(10 + 5)
10 + 5 is $($count + 5)
以下源,
$i = 5; $j = 10; $k = 15
"`$i, `$j, and `$k have the values $( $i; $j; $k )"
生成如下所示的可展开字符串文本项:
$i, $j, and $k have the values 5 10 15
这四行可以更简洁地编写,如下所示:
"`$i, `$j, and `$k have the values $(($i = 5); ($j = 10); ($k = 15))"
在以下示例中,
"First 10 squares: $(for ($i = 1; $i -le 10; ++$i) { "$i $($i*$i) " })"
生成的可展开字符串文本如下所示:
First 10 squares: 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100
如图所示,子表达式可以包含具有变量替换和子表达式展开的字符串文本。 另请注意,内部可展开字符串文本的分隔符不需要转义,因为它们在子表达式中,这意味着它们无法成为外部可展开字符串文本的终止符。
每次使用时,包含变量替换或子表达式展开的可展开字符串文本或可展开显示字符串文本都会得到计算;例如,
$a = 10
$s1 = "`$a = $($a; ++$a)"
"`$s1 = >$s1<"
$s2 = "`$a = $($a; ++$a)"
"`$s2 = >$s2<"
$s2 = $s1
"`$s2 = >$s2<"
生成如下所示的可展开字符串文本项:
$s1 = >$a = 10<
$s2 = >$a = 11<
$s2 = >$a = 10<
逐字显示字符串文本的内容是逐字显示的,包括正文中任何前导空格或尾随空格。 因此,嵌入式单引号字符不需要加倍,并且没有替换或展开。 例如,
$lit = @'
That's it!
2 * 3 = $(2*3)
'@
结果是文本
That's it!
2 * 3 = $(2*3)
可展开显示字符串的内容会被替换和展开,但正文中位于任何 子表达式之外的任何前导或尾随空格是逐字显示的,嵌入的双引号不需要加倍。 例如,
$lit = @"
That's it!
2 * 3 = $(2*3)
"@
展开后会生成以下文本:
That's it!
2 * 3 = 6
对于逐字显示字符串文本和可展开显示字符串文本,正文中的每个行终止符在生成的文本中由实现定义的方式进行表示。 例如,在
$lit = @"
abc
xyz
"@
正文的第二行有两个前导空格,正文的第一行和第二行有行终止符:但是,正文第二行的终止符 不是该正文的一部分。 生成的文本等效于:"abc<implementation-defined character sequence>xyz"
。
注意
为了帮助源的可读性,可以在多个源行之间断开长字符串文本,而无需插入行终止符。 这是通过将每个部分编写为单独的文字常量,并使用 + 运算符(§7.7.2)将这些部分连接起来来完成的。 此运算符允许其操作数指定四种字符串文本中的任何一种。
注意
虽然没有字符文本本身之类的内容,但可以通过访问 1 个字符字符串中的第一个字符来实现相同的效果,如下所示:[char]"A"
或 "A"[0]
。
对于 逐字显示字符串文本和可展开显示字符串文本,正文中的每个行终止符都完全按提供的方式表示。
2.3.5.3 空文本
请参阅自动变量 $null
(§2.3.2.2)。
2.3.5.4 布尔文本值
请参阅自动变量 $false
和 $true
(§2.3.2.2)。
2.3.5.5 数列文本
PowerShell 允许数组类型的表达式使用一元逗号运算符(§7.2.1)、数组表达式(§7.1.7)、二元逗号运算符(§7.3),以及范围运算符(§7.4)。
2.3.5.6 哈希文本
PowerShell 允许编写哈希表类型的表达式 (§10),使用 哈希文本表达式 (§7.1.9)
2.3.5.7 类型名称
语法:
type-name:
type-identifier
type-name . type-identifier
type-identifier:
type-characters
type-characters:
type-character
type-characters type-character
type-character:
A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nd
_ (The underscore character U+005F)
array-type-name:
type-name [
generic-type-name:
type-name [
2.3.6 运算符和标点符号
语法:
operator-or-punctuator: one of
{ } [ ] ( ) @( @{ $( ;
&& || & | , ++ .. :: .
! * / % + - --
-and -band -bnot -bor
-bxor -not -or -xor
assignment-operator
merging-redirection-operator
file-redirection-operator
comparison-operator
format-operator
assignment-operator: one of
= -= += *= /= %=
file-redirection-operator: one of
> >> 2> 2>> 3> 3>> 4> 4>>
5> 5>> 6> 6>> *> *>> <
merging-redirection-operator: one of
*>&1 2>&1 3>&1 4>&1 5>&1 6>&1
*>&2 1>&2 3>&2 4>&2 5>&2 6>&2
comparison-operator: *one of
-as -ccontains -ceq
-cge -cgt -cle
-clike -clt -cmatch
-cne -cnotcontains -cnotlike
-cnotmatch -contains -creplace
-csplit -eq -ge
-gt -icontains -ieq
-ige -igt -ile
-ilike -ilt -imatch
-in -ine -inotcontains
-inotlike -inotmatch -ireplace
-is -isnot -isplit
-join -le -like
-lt -match -ne
-notcontains -notin -notlike
-notmatch -replace -shl*
-shr -split
format-operator:
-f
描述:
&&
和 ||
保留供将来使用。
注意
编辑器说明:PowerShell 7 中引入了管道链运算符 &&
和 ||
。 请参见关于管道链运算符。
运算符中的短划线名称仅专用于运算符相关的上下文。
以 短划线开头的运算符 在该 短划线 及其后面的标记之间不得有任何空格。
2.3.7 转义符
语法:
escaped-character:
` (The backtick character U+0060) followed by any Unicode character
描述:
转义字符是一种通过为其分配前缀 Backtick 字符 (U+0060) 为字符分配特殊解释的方法。 下表显示了每个 转义字符的含义:
转义字符 | 意义 |
---|---|
`a |
警报(U+0007) |
`b |
Backspace (U+0008) |
`f |
换页 (U+000C) |
`n |
换行 (U+000A) |
`r |
回车 (U+000D) |
`t |
水平制表符 (U+0009) |
`v |
垂直制表符 (U+0009) |
`' |
单引号 (U+0027) |
`" |
双引号 (U+0022) |
`` |
反引号 (U+0060) |
`0 |
NUL (U+0000) |
`x |
如果 x 是上述字符之外的其他字符,则忽略反引号字符,并按字面取 x 。 |
上表中最后一项的含义是,本来用于分隔符号的空格可以改为成为符号的一部分。 例如,包含空格的文件名可以编写为 Test` Data.txt
(以及 'Test Data.txt'
或 "Test Data.txt"
)。