【发布时间】:2019-05-25 02:57:48
【问题描述】:
我对 $_ 变量在某些管道环境中的工作方式感到困惑。在此示例中用于备份 Bitlocker 密钥:
Get-BitlockerVolume | % {$_.KeyProtector | ? RecoveryPassword | Backup-BitlockerKeyProtector -MountPoint $_.MountPoint}
我是这样读英文的:
- 获取所有 BitLockerVolume 对象
- 对于每个 BitLockerVolume 对象,将 KeyProtector 字段通过管道转发
- 管道 KeyProtector 对象进一步转发给具有 RecoverPassword 的对象
- 运行 Backup-BitlockerKeyProtector,并提供 MountPoint
但是,MountPoint 是 BitLockerVolume 对象的一个字段,如下所示:
PS C:\Windows\system32> Get-BitLockerVolume | Get-Member | Where-Object {$_.Name -eq "MountPoint"}
TypeName: Microsoft.BitLocker.Structures.BitLockerVolume
Name MemberType Definition
---- ---------- ----------
MountPoint Property string MountPoint {get;}
那么,对于包裹在方括号 { } 中的整个块,$_ 变量在任何数量的管道中总是相同吗?例如,我们正在转发的对象正在改变。它不再是 BitLockerVolume 对象,而是 KeyProtector 对象。那么在这种情况下,$_ 会始终引用 BitLockerVolume 对象,还是会根据通过链进一步传输的不同类型的对象而在管道中进一步更改?
【问题讨论】:
-
我投了反对票,因为网上和 StackOverflow 上有大量信息:stackoverflow.com/questions/3494115/…
-
@I.TDelinquent 除了我用管道的具体示例和场景询问外,不仅仅是通用的“我使用 $_ 打印数字”
-
@I.TDelinquent 很明显,我没有写过关于“什么是 $_”的帖子,对此有所了解,并询问了具体的上下文。
-
$_指的是来自最后一个管道的对象。 -
@montonero 这就是我感到困惑的地方。所以在这种情况下,最后一个管道部分中的 $PSItem(又名 $_)对象应该是 KeyProtector,而不是实际上的 BitLockerVolume 对象?如果是这种情况,那么我的 $_.MountPoint 将不起作用,因为这是管道中较早的原始对象的字段,而不是 KeyProtector 的字段。
标签: powershell pipe