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转义字符表