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
`` 反引号本身
上一篇 下一篇

猜你喜欢

热点阅读