PowerShell 7中Get-ADUser -Filter无法使用变量的问题
解决PowerShell 7中Get-ADUser过滤器无法使用变量的问题
问题原因
- 自动变量冲突:
$Input是PowerShell内置的自动变量,专门用于接收管道输入的对象集合。PowerShell 7对自动变量的使用检查更严格,非管道场景下引用会触发"未定义"错误;而PowerShell 5.1的AD模块对过滤器变量解析逻辑较宽松,允许这种非标准用法。 - 过滤器字符串解析差异:AD模块的
-Filter参数在单引号字符串中时,PowerShell不会展开变量。PowerShell 5.1的AD模块可能额外解析了单引号内的变量,而PowerShell 7的AD模块不再支持该行为。
解决方案
方案1:使用脚本块格式的过滤器(推荐)
脚本块格式是PowerShell 3.0+官方推荐的用法,能自动处理变量传递,无需担心引号或转义问题:
# 替换为自定义变量名,避免使用自动变量$Input $targetSamAccount = "你的目标账号名" Get-ADUser -server $DC -Filter {sAMAccountName -eq $targetSamAccount} -Properties $sProperties | Select $sProperties
方案2:使用双引号字符串并正确转义变量
如果偏好字符串格式的过滤器,需用双引号包裹,并转义$符号(让AD模块识别变量名):
$targetSamAccount = "你的目标账号名" Get-ADUser -server $DC -Filter "sAMAccountName -eq `$targetSamAccount" -Properties $sProperties | Select $sProperties
方案3:直接拼接过滤器字符串
将变量值直接拼入过滤器字符串,让AD模块直接解析最终表达式:
$targetSamAccount = "你的目标账号名" $filterExpr = "sAMAccountName -eq '$targetSamAccount'" Get-ADUser -server $DC -Filter $filterExpr -Properties $sProperties | Select $sProperties
关键注意事项
- 永远避免在非管道场景下使用
$Input自动变量,改用自定义变量名,避免冲突。 - 脚本块格式的过滤器兼容性更好,能减少因PowerShell版本或AD模块更新导致的语法问题。
内容的提问来源于stack exchange,提问作者Tihomir Buncic
相关产品推荐
相关产品推荐

