PowerShell给字符串每隔2位插入冒号运行结果异常如何解决?
问题原因
1. 为什么会出现多行输出
PowerShell的默认行为是:未被变量接收、未被管道消费的方法返回值,会直接输出到标准输出流。你循环内的$s.Insert($i,':')没有将返回值赋值给任何变量,所以每次循环都会把Insert生成的临时字符串直接输出,这就是你看到的前几行内容的来源,最后一行才是Write-Host $s的输出。
2. 为什么$s的修改没有生效
.NET中字符串是不可变类型,所有对字符串进行修改的方法(比如Insert、Replace等)都不会修改原字符串,只会返回一个修改后的新字符串。
你的循环里每次都是直接调用原始$s的Insert方法,没有将返回的新字符串赋值回$s,所以原始$s自始至终都没有被修改,每次循环都是基于初始的51402ec0110b3e3c进行插入,自然和链式调用的效果不一样——链式调用是每一步都拿到上一步返回的新字符串,再调用下一次Insert,相当于每一步都隐式做了赋值操作。
修正方案
方案1:修改原有循环逻辑
每次Insert后将结果赋值回$s即可:
$s = "51402ec0110b3e3c" for ($i = 2; $i -lt $s.Length; $i+=3) { $s = $s.Insert($i,':') } Write-Host $s
方案2:更简洁的正则实现
直接用正则匹配每2个字符,替换为$&:再去掉末尾多余的冒号即可:
$s = "51402ec0110b3e3c" $s = [regex]::Replace($s, '..', '$&:').TrimEnd(':') Write-Host $s
两种方案最终都会输出你预期的51:40:2e:c0:11:0b:3e:3c。
内容的提问来源于stack exchange,提问作者xDoz3
相关产品推荐
相关产品推荐

