powershell - 在 PowerShell 中管道时 $_ 是如何工作的?
问题描述
我很困惑 $_ 变量在某些管道环境中是如何工作的。在此用于备份 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 对象,还是会根据通过链进一步传输的不同类型的对象而进一步改变管道?
解决方案
所以 $_ 是来自当前管道的信息。
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
}
推荐阅读
- r - r中按字母顺序对数据进行分类
- java - 将 HTML 页面模板与用户数据一起存储在 DOCX 文件中后的外观
- vba - 下载大文件时VBA没有足够的内存资源错误
- dart - 从 Uint8List Dart 解析 int 和 float 值
- neo4j - neo4j 加载 csv 花费无限时间来执行我的查询
- typescript - 现在两只眼睛都没有出现,
- multi-index - 创建 2 级多索引
- amazon-web-services - 我们能否在不停机的情况下将 AWS redshift 从一个 VPC 迁移到另一个 VPC?
- javascript - 未捕获的 ReferenceError:未定义变量
- javascript - 反应路由中的错误 404