powershell中的字符串操作

402 阅读3分钟

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

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

符号类型调用示例输入结果
#数字占位符“{0:(#).##}” -f $value(1000000)
%百分号“{0:0%}” -f $value100000000%
,千分符“{0:0,0}” -f $value1,000,000
,.一千的整数倍“{0:0,.} ” -f $value1000
.小数点“{0:0.0}” -f $value1000000.0
0占位符 0“{0:00.0000}” -f$value1000000.0000
c货币“{0:c}” -f $value¥1,000.00
d十进制“{0:d}” -f $value1000000
e科学计数法“{0:e}” -f $value1.000000e+006
e指数通配符“{0:00e+0}” -f $value10e+5
f保留小数位“{0:f}” -f $value1000000.00
g常规“{0:g}” -f $value1000000
n千分符“{0:n}” -f $value1,000,000.00
x十六进制“0x{0:x4}” -f $value0x4240

还有日期时间相关的。

符号类型调用示例输出
d短日期格式“{0:d}” –f $value2013/6/1
D长日期格式“{0:D}” –f $value2013年6月1日
t短时间格式“{0:t}” –f $value“{0:t}” –f $value
T长时间格式“{0:T}” –f $value23:18:50
f完整日期和时间(短)“{0:f}” –f $value2013年6月1日 23:18
F完整日期和时间(长)“{0:F}” –f $value2013年6月1日 23:18:50
g标准时间 (短)“{0:g}” –f $value2013/6/1 23:18
G标准时间长 (长)“{0:G}” –f $value2013/6/1 23:18:50
M月日格式“{0:M}” –f $value6月1日
rRFC1123 日期格式“{0:r}” –f $valueSat, 01 Jun 2013 23:18:50 GMT
s排序日期格式“{0:s}” –f $value2013-06-01T23:18:50
u通用日期格式“{0:u}” –f $value2013-06-01 23:18:50Z
U通用排序日期 GMT格式“{0:U}” –f $value2013年6月1日 15:18:50
Y年/月格式模式“{0:Y}” –f $value2013年6月
自定义日期格式
dd一个月中天“{0:dd}” -f $value01
ddd星期的缩写“{0:ddd}” -f $value周六
dddd完整星期“{0:dddd}” -f $value星期六
gg纪年法“{0:gg}” -f $value公元
hh小时0-12“{0:hh}” -f $value11
HH小时0-23“{0:HH}” -f $value23
mm分钟“{0:mm}” -f $value18
MM月份“{0:MM}” -f $value06
MMM月份缩写“{0:MMM}” -f $value六月
MMMM完整月份“{0:MMMM}” -f $value六月
ss“{0:ss}” -f $value55
tt上午或者下午“{0:tt}” -f $value下午
yy两位数字的年份“{0:yy}” -f $value13
yyyy四位数字的年份“{0:yyyy}” -f $value2013
zz不包含分钟的时区“{0:zz}” -f $value+08
zzz包含分钟的时区“{0:zzz}” -f $value+08:00

05.join 拼接字符串列表

$servers = @(
    'server1'
    'server2'
    'server3'
)

$servers  -join ','

concat方法也可以拼接

[string]::Concat('server1','server2','server3')
[string]::Concat($servers)

06.JOIN-PATH路径拼接

$folder = 'Temp'
Join-Path -Path 'c:\windows' -ChildPath $folder

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转义字符表
转义字符描述
``n`换行符
``r`回车符
``t`制表符
``a`响铃符
``b`退格符
``’`单引号
``”`双引号
``0`Null
``反引号本身