为何PowerShell switch语句中$_会被截断为子串值?
PowerShell Switch语句内
$_被截断的原因解释 问题场景
在PowerShell 7.3.5中运行以下代码时,会发现Switch语句内部的$_值被截断为子串,但Switch外部的$_却保持完整:
$a = 'abc,defg'; $a.Split(",") | ForEach-Object { $s = $_; write-host "Before" $_; Switch ($_.substring(0,1)) { default { write-host "During" $_; write-host "Actual" $s; } } write-host "After" $_; write-host "==="; }
运行输出:
Before abc During a Actual abc After abc === Before defg During d Actual defg After defg ===
原因解析
这是PowerShell Switch语句的默认行为:当你向Switch传入一个值时,Switch块内部的$_会自动绑定到当前正在处理的输入值。
在你的代码里,Switch的输入是$_.substring(0,1)——也就是ForEach-Object中当前完整字符串的第一个字符(比如"abc"对应的"a")。所以在Switch块内部,$_指向的是这个截断后的子串,而非ForEach-Object作用域里的原始完整字符串。
而你提前把原始的$_赋值给了变量$s,这个变量不受Switch内部$_的覆盖,所以$s能保留原始的完整值。
解决办法
如果需要在Switch内部同时使用子串和原始完整值,有两种简单方式:
- 延续你当前的写法,提前把原始
$_存入临时变量,在Switch块内引用该变量 - 使用
Switch的-Variable参数自定义变量名,用来保存原始值:
$a = 'abc,defg'; $a.Split(",") | ForEach-Object { write-host "Before" $_; # 用-Variable指定原始值的变量名 Switch -InputObject $_.substring(0,1) -Variable originalStr { default { write-host "During" $_; # 子串值 write-host "Actual" $originalStr;# 原始完整字符串 } } write-host "After" $_; write-host "==="; }
内容的提问来源于stack exchange,提问作者StuKay
相关产品推荐
相关产品推荐

