powershell中的字符串操作
2022-07-31 本文已影响0人
mudssky
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 $value | 100000000% |
, | 千分符 | “{0:0,0}” -f $value | 1,000,000 |
,. | 一千的整数倍 | “{0:0,.} ” -f $value | 1000 |
. | 小数点 | “{0:0.0}” -f $value | 1000000.0 |
0 | 占位符 0 | “{0:00.0000}” -f$value | 1000000.0000 |
c | 货币 | “{0:c}” -f $value | ¥1,000.00 |
d | 十进制 | “{0:d}” -f $value | 1000000 |
e | 科学计数法 | “{0:e}” -f $value | 1.000000e+006 |
e | 指数通配符 | “{0:00e+0}” -f $value | 10e+5 |
f | 保留小数位 | “{0:f}” -f $value | 1000000.00 |
g | 常规 | “{0:g}” -f $value | 1000000 |
n | 千分符 | “{0:n}” -f $value | 1,000,000.00 |
x | 十六进制 | “0x{0:x4}” -f $value | 0x4240 |
还有日期时间相关的。
符号 | 类型 | 调用示例 | 输出 |
---|---|---|---|
d | 短日期格式 | “{0:d}” –f $value | 2013/6/1 |
D | 长日期格式 | “{0:D}” –f $value | 2013年6月1日 |
t | 短时间格式 | “{0:t}” –f $value | “{0:t}” –f $value |
T | 长时间格式 | “{0:T}” –f $value | 23:18:50 |
f | 完整日期和时间(短) | “{0:f}” –f $value | 2013年6月1日 23:18 |
F | 完整日期和时间(长) | “{0:F}” –f $value | 2013年6月1日 23:18:50 |
g | 标准时间 (短) | “{0:g}” –f $value | 2013/6/1 23:18 |
G | 标准时间长 (长) | “{0:G}” –f $value | 2013/6/1 23:18:50 |
M | 月日格式 | “{0:M}” –f $value | 6月1日 |
r | RFC1123 日期格式 | “{0:r}” –f $value | Sat, 01 Jun 2013 23:18:50 GMT |
s | 排序日期格式 | “{0:s}” –f $value | 2013-06-01T23:18:50 |
u | 通用日期格式 | “{0:u}” –f $value | 2013-06-01 23:18:50Z |
U | 通用排序日期 GMT格式 | “{0:U}” –f $value | 2013年6月1日 15:18:50 |
Y | 年/月格式模式 | “{0:Y}” –f $value | 2013年6月 |
自定义日期格式 | |||
dd | 一个月中天 | “{0:dd}” -f $value | 01 |
ddd | 星期的缩写 | “{0:ddd}” -f $value | 周六 |
dddd | 完整星期 | “{0:dddd}” -f $value | 星期六 |
gg | 纪年法 | “{0:gg}” -f $value | 公元 |
hh | 小时0-12 | “{0:hh}” -f $value | 11 |
HH | 小时0-23 | “{0:HH}” -f $value | 23 |
mm | 分钟 | “{0:mm}” -f $value | 18 |
MM | 月份 | “{0:MM}” -f $value | 06 |
MMM | 月份缩写 | “{0:MMM}” -f $value | 六月 |
MMMM | 完整月份 | “{0:MMMM}” -f $value | 六月 |
ss | 秒 | “{0:ss}” -f $value | 55 |
tt | 上午或者下午 | “{0:tt}” -f $value | 下午 |
yy | 两位数字的年份 | “{0:yy}” -f $value | 13 |
yyyy | 四位数字的年份 | “{0:yyyy}” -f $value | 2013 |
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 |
`` | 反引号本身 |