powershell中的字符串操作

01.加法

$name = 'Kevin Marquette'
$message = 'Hello, ' + $name
$first = 'Kevin'
$last = 'Marquette'
$message = 'Hello, ' + $first + ' ' + $last + '.'

02.变量替换

和bash脚本是一样的,双引号里面的变量会被替换

$message = "Hello, $first $last."

03.命令替换

下面的写法导致一种错误,不是我们期望的结果

$directory = Get-Item 'c:\windows'
$message = "Time: $directory.CreationTime"

涉及到属性值的时候,我们应该把整个用$()包裹。

否则只会解析到.前面的部分作为变量,不会继续解析下去。

$message = "Time: $($directory.CreationTime)"

执行命令也是一样的,

$message = "Date: $(Get-Date)"

04.格式化字符串

下面两种方法比较常见

# .NET string format string
[string]::Format('Hello, {0} {1}.',$first,$last)
# PowerShell format string
'Hello, {0} {1}.' -f $first, $last

用数组格式化

$values = @(
    "Kevin"
    "Marquette"
'Hello, {0} {1}.' -f $values

高级格式化

"{0:yyyyMMdd}" -f (Get-Date)
"Population {0:N0}" -f  8175133

powershell的格式化语法其实来自.NET

有很多,我们只要记住一些常用的就行了

07.StringBuilder优化字符串拼接

字符串是一个字符组成的数组,因此每次+拼接都是重新创建一个数组并赋值,因此会带来性能问题

$message = "Numbers: "
foreach($number in 1..10000)
    $message += " $number"

用StringBuilder性能就好得多。

$stringBuilder = New-Object -TypeName "System.Text.StringBuilder"
[void]$stringBuilder.Append("Numbers: ")
foreach($number in 1..10000)
    [void]$stringBuilder.Append(" $number")
$message = $stringBuilder.ToString()

08.使用花括号区分字符串和变量

$test = "Bet"
$tester = "Better"
Write-Host "$test $tester ${test}ter"

有一种替代的方法

Write-Host "$test $tester $($test)ter"
Write-Host "{0} {1} {0}ter" -f $test, $tester

09.-replace替换标记

$letter = Get-Content -Path TemplateLetter.txt -RAW
$letter = $letter -replace '#FULL_NAME#', 'Kevin Marquette'

替换多个标记

$tokenList = @{
    Full_Name = 'Kevin Marquette'
    Location = 'Orange County'
    State = 'CA'
$letter = Get-Content -Path TemplateLetter.txt -RAW
foreach( $token in $tokenList.GetEnumerator() )
    $pattern = '#{0}#' -f $token.key
    $letter = $letter -replace $pattern, $token.Value

另一种替换方法 ExecutionContext ExpandString

有一种方法替换单引号的字符串

$message = 'Hello, $Name!'
$name = 'Kevin Marquette'
$string = $ExecutionContext.InvokeCommand.ExpandString($message)

也可以多次调用吧

$message = 'Hello, $Name!'
$nameList = 'Mark Kraus','Kevin Marquette','Lee Dailey'
foreach($name in $nameList){
    $ExecutionContext.InvokeCommand.ExpandString($message)

10.转义字符

Powershell转义字符表