0%

PowerShell专题:变量中的特殊字符

PowerShell 中变量的一般语法是:$variable

【变量语法的好处】
这种语法有一个好处是,只有以 $ 开头的才是变量,所以通常字符串不需要单/双引号定界符。
比如:Write-Host $test me 会将名为 test 的变量值通过空格拼接上字符串 me (注音这里字符串没有用引号引起来)。

但是,很容易想到的一个问题是,如果变量名后没有空格自然分割,那么从逻辑上就不能区分变量名的界限。比如:$testme 并不能表示名为 test 的变量值直接拼接上字符串 me,而是表示名为变量 testme 的变量。

另一方面,该语法中,变量名也不能包含空格、标点符号(如冒号)、运算符或其他特殊字符。但是,如果使用另一种带定界符的变量语法,基本上任意特殊字符都可以用于变量名。

另一种变量语法是:${variable}

当然,普通的变量名也可以用花括号括起来,只是不必要。

使用该语法可以定义诸如此类的特殊变量:

1
2
3
4
5
6
7
${1+1} = "等于2"
Write-Host ${1+1}
# 输出:等于2

${my var} = "带空格的变量名"
Write-Host ${my var}
# 输出:带空格的变量名

还有一种场景是,引用变量对象的属性或调用方法,独立的形式下可以直接访问:

1
2
Write-Host $test.GetType().Name
# 输出:String

但是,当其前后紧临其他内容时,需要使用 $() 将整个链式访问括起来:

1
2
3
4
5
6
$test = "test"
Write-Host prefix$($test.GetType().Name)
# 输出:prefixString

# 当然,可以把每次的 . 访问都括起来(虽然没有必要)
Write-Host prefix$($($test.GetType()).Name)

【回顾小结】

  • 普通变量访问语法 $variable
  • 包含特殊字符或紧临其他内容时 ${variable}
  • 链式访问属性/方法 $(${variable}.propertyOrMethod)