Powershell Where-Object and BitLocker



我有一个powershell脚本,其最终目标是将BitLocker恢复密钥打印到文本文件中,但我希望使用where对象只获取RecoveryPassword,而不是TPM信息。

如果我跑完最后一行,效果很好。如果我试图运行传递给一个变量的命令,我会得到一个错误:";。KeyProtectorType:术语".KeyProtectorType"未被识别为cmdlet、函数、脚本文件或可操作程序的名称。检查姓名的拼写,或者,如果包含路径,请验证该路径是否正确,然后重试">

我认为目录更改有一些问题,因为它是在一个变量中传递的,但我不知道如何解决它

$location = "$env:UserProfileDesktopBitLockerRecoveryKey.txt"
$args = "Get-BitLockerVolume -MountPoint C:| Select-Object -ExpandProperty KeyProtector | Where-Object{$_.KeyProtectorType -eq 'RecoveryPassword'}| Select-Object KeyProtectorID,RecoveryPassword >"  + $location
# Get the ID and security principal of the current user account
iex $args
Get-BitLockerVolume -MountPoint C:| Select-Object -ExpandProperty KeyProtector | Where-Object{$_.KeyProtectorType -eq 'RecoveryPassword'}| Select-Object KeyProtectorID,RecoveryPassword
通常应避免使用
  • Invoke-Expression(iex(;绝对不要使用它来调用外部程序或PowerShell脚本,即使您需要以编程方式构建其参数-后者最好通过splating来完成。

  • 不要将自动$args变量用于自定义目的。

  • 如果确实需要将$字符逐字嵌入到可扩展(双引号(字符串("..."(中,请将它们转义为`$。如果字符串实际上不需要扩展(字符串插值(,请使用逐字逐句(单引号(字符串('...'(

    • 忽略将$字符转义为"..."字符串中的`$是导致问题的原因:$_iex看到结果字符串之前被展开,并且在管道之外,自动$_变量没有值

在您的情况下,您可以直接使用变量$location的值将输出文件路径传递给>,重定向运算符

$location = "$env:UserProfileDesktopBitLockerRecoveryKey.txt"
Get-BitLockerVolume -MountPoint C:|
Select-Object -ExpandProperty KeyProtector |
Where-Object KeyProtectorType -eq RecoveryPassword | 
Select-Object KeyProtectorID, RecoveryPassword > $location

请注意,我在上面的Where-Object调用中使用了简化的语法。