介绍Powershell中字符串的一些基本操作。

简介

和传统的Shell(比如Bash)一致,PowerShell中的字符串由单引号'和双引号"定义。这两者的区别是:

  • 单引号'定义的字符串就是字符串本身(Literal String)
  • 双引号"定义的字符串会进行一些展开操作(Expaned String)

下面是例子:

PS C:\> $x = 'world!'
PS C:\> 'Hello, $x'
Hello, $x
PS C:\> "Hello, $x"
Hello, world!

上面的例子中,双引号的"Hello, $x"被扩展成了Hello, world!

为了避免字符串展开,可以在展开操作符$之前放置一个转义字符`"Hello, `$x"的计算结果是Hello, $x。转义字符`还可以用来表示空行,比如"`n"输出一个空行:

PS C:\> "`n"
PS C:\> 'Hello, $x'
Hello, $x
PS C:\> "Hello, $x"
Hello, world!

基于System.String的字符串操作

Powershell是基于DotNet的,所以它的字符串其实对应着DotNet的System.String类型。用下面的命令可以查看System.String的类型和方法:

PS C:\> 'Hi!'.GetType()
IsPublic IsSerial Name                                     BaseType
...
True     True     String                                   System.Object

PS C:\> 'Hi' | Get-Member

   TypeName: System.String

Name             MemberType            Definition
...
EndsWith         Method                bool EndsWith(string value), bool EndsWith(string value, System.StringComparison comparisonType), bool EndsWith(string value, ...
Equals           Method                bool Equals(System.Object obj), bool Equals(string value), bool Equals(string value, System.StringComparison comparisonType), ...
...

所以,我们可以直接调用System.String的方法来进行字符串处理:

PS C:\> 'Hello, world!'.LastIndexOf('H')
0

PS C:\> 'Hello, world!'.SubString(0, 5)
Hello

PS C:\> 'Hello, world!'.Split(',')
Hello
 world!

PS C:\> 'Hello, world!'.Equals('Hello')
False

PS C:\> 'Hello, world!'.CompareTo('Hello')
1

PS C:\> 'Hello, world!'.Remove(5)
Hello

PowerShell内建的字符串操作

除了调用System.String的方法意外,为了方便使用,PowerShell内建了许多字符串操作。

光字符串串联(Concatenation)操作就有几种方式:

PS C:\> 'Hello' + ', ' + 'World!'
Hello, World!

> -join('Hello', ', ', 'world!')
Hello, world!

> 'Hello', 'World!' -join ', '
Hello, World!

字符串比较:

> 'Hello' -eq 'hello'
True

> 'Hello' -ceq 'hello'
False

> 'world!' -like 'world?'
True

基于正则表达式的比较:

PS C:\> 'Hello, world!' -match '(\w+), world!'
True

PS C:\> $Matches

Name                           Value
----                           -----
1                              Hello
0                              Hello, world!

使用-f操作来格式化输出字符串:

# $msg是一个数组,有两个字符串,用逗号分隔
PS C:\> $msg = @('Hello', 'world!')
# {0}占位符被替换成第一个字符串,{1}被替换成第二个
PS C:\> "{0}, {1}" -f $msg
Hello, world!


PS C:\> $now = Get-Date
PS C:\> "The time is [{0:HH}:{0:mm}:{0:ss}]" -f $now
The time is [21:21:21]

字符串与数值的转化

PS C:\> $s = '10'
PS C:\> $n = [int]$s
PS C:\> $n.GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

PS C:\> [string]$n
10
PS C:\> $n.ToString()
10

参考链接