You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中BitLocker恢复密钥筛选命令存变量执行报错求助

问题分析与解决

错误原因

你将命令存入双引号字符串后用iex执行时,字符串中的$_会被PowerShell提前解析为当前作用域的管道变量,导致最终执行的Where-Object脚本块变成{.KeyProtectorType -eq 'RecoveryPassword'},这是无效语法,因此报错“.KeyProtectorType 未被识别”。而直接运行命令时,$_处于管道上下文,能正常指代当前对象,所以没有问题。

解决方案

方案1:直接执行命令(推荐)

避免使用iex执行字符串命令,直接将输出重定向到目标文件,语法更安全且不易出错:

$location = "$env:UserProfile\Desktop\BitLockerRecoveryKey.txt"

Get-BitLockerVolume -MountPoint C: | 
  Select-Object -ExpandProperty KeyProtector | 
  Where-Object { $_.KeyProtectorType -eq 'RecoveryPassword' } | 
  Select-Object KeyProtectorID, RecoveryPassword |
  Out-File -FilePath $location -Encoding utf8

使用Out-File替代>可以指定编码,避免潜在的乱码问题。

方案2:修复字符串解析问题(不推荐)

如果必须用字符串+iex执行,需要阻止$_被提前解析,两种方式可选:

  1. 用单引号包裹命令字符串:单引号内的变量不会被PowerShell解析,注意单引号内部的单引号需用两个''转义:
$location = "$env:UserProfile\Desktop\BitLockerRecoveryKey.txt"
$cmd = 'Get-BitLockerVolume -MountPoint C:| Select-Object -ExpandProperty KeyProtector | Where-Object{$_.KeyProtectorType -eq ''RecoveryPassword''}| Select-Object KeyProtectorID,RecoveryPassword >' + $location
iex $cmd
  1. 在双引号中转义$符号:将$_改为$_,阻止PowerShell提前解析该变量:
$location = "$env:UserProfile\Desktop\BitLockerRecoveryKey.txt"
$cmd = "Get-BitLockerVolume -MountPoint C:| Select-Object -ExpandProperty KeyProtector | Where-Object{`$_.KeyProtectorType -eq 'RecoveryPassword'}| Select-Object KeyProtectorID,RecoveryPassword >" + $location
iex $cmd

内容的提问来源于stack exchange,提问作者Lason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:03:21