PowerShell从CSV第二列提取AD组所有者并保留失败输出
问题解答
核心结论
不是只修改foreach部分,得调整好几个环节才能满足你的需求:
具体修改步骤
- 替换文件读取方式
原代码用Get-Content读文件,没法直接按CSV的列名提取数据,必须换成Import-Csv才能精准读取标题为“Owners”的第二列:
Import-Csv "C:\tmp\SMB.csv" | ForEach-Object { # 后续逻辑写在这里 }
- 修改foreach块内的逻辑,同时保留失败输出
在循环里加入错误捕获,把成功查询的结果和失败的错误信息都写入输出文件:
Import-Csv "C:\tmp\SMB.csv" | ForEach-Object { $groupName = $_.Owners try { # 尝试查询AD组,强制捕获所有错误 $group = Get-ADGroup -Identity $groupName -Properties Name, managedby -ErrorAction Stop # 把managedby字段转换为可读的用户名,输出成功结果 [PSCustomObject]@{ 组名 = $group.Name 所有者 = if ($group.managedby) { Get-ADUser $group.managedby -Properties Name | Select-Object -ExpandProperty Name } else { "无所有者" } 状态 = "成功" } } catch { # 捕获失败信息,输出具体错误详情 [PSCustomObject]@{ 组名 = $groupName 所有者 = $null 状态 = "失败: $($_.Exception.Message)" } } } | Export-Csv "C:\temp\test.csv" -Append -NoTypeInformation
- 关键说明
- 原代码用
Get-Content会把整行文本当作AD组名查询,完全不符合按列提取的需求,这步是必须改的 - 用
try/catch配合-ErrorAction Stop才能捕获查询失败的情况,把错误信息保留到结果里 - 用
Export-Csv代替Out-File,输出的CSV格式更规范,后续处理更方便
内容的提问来源于stack exchange,提问作者Calarian
相关产品推荐
相关产品推荐

