首页 > 解决方案 > 在 PowerShell 中管道时 $_ 是如何工作的?

问题描述

我很困惑 $_ 变量在某些管道环境中是如何工作的。在此用于备份 Bitlocker 密钥的示例中:

Get-BitlockerVolume | % {$_.KeyProtector | ? RecoveryPassword | Backup-BitlockerKeyProtector -MountPoint $_.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 对象,还是会根据通过链进一步传输的不同类型的对象而进一步改变管道?

标签: powershellpipe

解决方案


所以 $_ 是来自当前管道的信息。

1,2 | %{
    $_
}

回复

1
2

尽管

1,2 | %{
    "a","b" | %{
        $_
    }
}

回复

a
b
a
b

我们可以首先看到 %_ 的输出来自给定的最后一个信息,即1,2. 虽然下一个示例仍然循环 1,2 但输出来自管道内部a,b

可以通过将第一个管道信息存储到第二个管道中的变量中来解决这个问题

1,2 | %{
    $Num = $_
    "a","b" | %{
        $Num
    }
}

在这种情况下输出是

1
1
2
2

在您给出的示例中,让我们看看它的格式

Get-BitlockerVolume | % {
    $_.KeyProtector | ? RecoveryPassword | Backup-BitlockerKeyProtector -MountPoint $_.MountPoint
}

你有2个不同的管道。首先是获得“BitlockerVolumevolume”。第二个从您发送BitlockerVolume's KeyProtector.

就像说

对于每个 Bitlocker 卷,获取 KeyProtector。

对于每个 KeyProtector,让我拥有具有成员 RecoveryPassword 的 KeyProtector

Foreach KeyProtector with member RecoveryPassword,Backup Bitlocker Key Protector Using KeyProtector's Mountpoints

因此,在最后一点上,我还假设您给出的示例行不通。你可能要找的是这个...

Get-BitlockerVolume | % {
    $MountPoint = $_.MountPoint
    $_.KeyProtector | ? RecoveryPassword | Backup-BitlockerKeyProtector -MountPoint $MountPoint -KeyProtectorId $_.KeyProtectorId
}

推荐阅读