Powershell中foreach-object循环中$_的作用域是什么?



这是我想写的脚本的简化版本:

$i = 0
Get-ChildItem -Filter *.bat|
ForEach-Object {
Write-Host $_.Name
switch ($i) {
0 { Write-Host $_.Name}
1 { Write-Host $_.Name }
2 { Write-Host $_.Name }
Default {Write-Host "nothing here"}
}
}

所以第一个Write-Host命令按预期工作,但是一旦我进入switch语句,Write-Host什么也没打印出来,这让我很困惑。我认为这个问题与$_的范围有关,但我不知道。我是一个完全的Powershell业余爱好者。switch语句不是在foreach循环内,所以作用域不应该是一个问题吗?

如果我这样做,那么一切都像我预期的那样工作,文件名从switch语句的内部和外部打印出来:

$i = 0
Get-ChildItem -Filter *.bat |
ForEach-Object {
Write-Host $_.Name
$temp = $_.Name
switch ($i) {
0 { Write-Host $temp }
1 { Write-Host $temp }
2 { Write-Host $temp }
Default {Write-Host "nothing here"}
}
}
谁能解释一下这是怎么回事?

如下所示:

about_Switch

问题是$_ automatic变量包含传递给switch语句的表达式的值。这意味着它不包含与输入switch语句之前相同的值。

移开,如果您想了解更多关于$_的信息,您也可以参考这篇文章:

$_在PowerShell中意味着什么

祝你好运

$_在您的switch语句中获得不同的值-它实际上获得$i的值,因此它是Int32,没有Name属性。当你赋值给$temp并在switch中使用它时,它会工作,因为你将(string)值赋给了一个新变量。

如果你在开关之后再次使用$_,你将能够像以前一样访问所有属性。

通过使用下面的代码,您可以看到$_在不同的作用域/管道中使用时采用的类型

Get-ChildItem -Filter *.bat |
ForEach-Object {
Write-Host $_.gettype()
switch ($i) {
Default {
Write-Host $_.gettype()
}
}
}

最新更新