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

使用Get-ADUser从CSV查询AD用户时提示变量未定义问题求助

解决PowerShell Get-ADUser 变量未定义错误

错误原因

问题出在Get-ADUser的-Filter参数使用了脚本块语法{displayName -eq $dname},这种写法会因作用域隔离导致脚本块内部无法访问外部定义的$dname变量。测试域与生产域的PowerShell/AD模块版本差异,是触发该问题的核心原因。

解决方案

方案1:改用字符串格式Filter(推荐)

将脚本块Filter替换为字符串格式,通过变量插值传递$dname的值,彻底规避作用域问题,同时优化导出逻辑提升效率:

$list = Import-Csv -Path "C:\data\PowerShell\UserInfo.csv"
$results = @()

ForEach ($user in $list) {
    $dname = $user.Displayname
    # 使用字符串格式Filter,确保变量能正常传递
    $adUser = Get-ADUser -Filter "displayName -eq '$dname'" -Properties lastLogon
    if ($adUser) {
        $output = $adUser | Select-Object Name, SamAccountName, @{
            Name="LastLogon"; 
            Expression={
                if ($_.lastLogon -ne 0) { [DateTime]::FromFileTime($_.lastLogon) } 
                else { "从未登录" }
            }
        }
        $results += $output
    }
}
# 一次性导出结果,避免循环追加的性能损耗与文件锁问题
$results | Export-CSV -Path "C:\data\PowerShell\user_last_login.csv" -NoTypeInformation

方案2:使用$using:作用域修饰符

若坚持使用脚本块Filter,可通过$using:修饰符让脚本块访问外部变量(适用于PowerShell 3.0及以上版本):

Get-ADUser -Filter {displayName -eq $using:dname} -Properties lastLogon

额外优化建议

  • 避免在循环中重复执行Export-CSV -append,先收集所有结果再一次性导出,大幅提升执行效率,同时避免潜在的文件锁定问题。
  • 增加lastLogon值判断:当lastLogon为0时,直接显示“从未登录”,结果更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:20:08