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

如何让PowerShell AD导出脚本实现自动清理旧CSV文件?

解决AD用户导出CSV的文件清理问题

原脚本从AD组提取用户属性并导出CSV到网络文件夹,但每次运行生成新文件,长期会积累大量文件。以下提供两种实现方案,按需选择:


方案一:仅保留最新版本(两种实现方式)

方式1:固定文件名,直接覆盖旧文件

将CSV文件名改为固定名称,每次运行直接覆盖原有文件,无需额外清理逻辑:

# 修改CSV文件定义,去掉时间戳
$Csvfile = Join-Path -Path $Path -ChildPath "******_User_List.csv"

# 导出时添加-Force参数强制覆盖
Export-Csv -Encoding UTF8 -Path $Csvfile -NoTypeInformation -Force

方式2:带时间戳文件名,仅保留最新一个

保留时间戳命名,但生成新文件后自动删除同前缀的旧文件:

# 原脚本的$Csvfile定义不变
$Csvfile = $Path + "\\******_User_List_$logDate.csv"

# 导出CSV(原导出代码不变)
$AllADUsers | Sort-Object Name | Select-Object `
@{Label = "First name"; Expression = { $_.GivenName } },
@{Label = "Last name"; Expression = { $_.Surname } },
@{Label = "UserName"; Expression = { $_.SamAccountName } },
@{Label = "Manager Name"; Expression = { (Get-AdUser $_.Manager -Properties DisplayName).DisplayName } },
@{Label = "Manager Email"; Expression = { (Get-AdUser $_.Manager -Properties Mail).Mail } },
@{Label = "User Title"; Expression = { $_.Title } },
@{Label = "E-mail"; Expression = { $_.Mail }} |
Export-Csv -Encoding UTF8 -Path $Csvfile -NoTypeInformation

# 清理旧文件:查找同前缀的CSV,保留最新的1个,删除其余
$allCsvFiles = Get-ChildItem -Path $Path -Filter "******_User_List_*.csv" | Sort-Object CreationTime -Descending
if ($allCsvFiles.Count -gt 1) {
    $allCsvFiles | Select-Object -Skip 1 | Remove-Item -Force
}

方案二:保留最多4个历史版本

生成新文件后,自动清理超出数量限制的旧文件,仅保留最新的4个:

# 原脚本的$Csvfile定义不变
$Csvfile = $Path + "\\******_User_List_$logDate.csv"

# 导出CSV(原导出代码不变)
$AllADUsers | Sort-Object Name | Select-Object `
@{Label = "First name"; Expression = { $_.GivenName } },
@{Label = "Last name"; Expression = { $_.Surname } },
@{Label = "UserName"; Expression = { $_.SamAccountName } },
@{Label = "Manager Name"; Expression = { (Get-AdUser $_.Manager -Properties DisplayName).DisplayName } },
@{Label = "Manager Email"; Expression = { (Get-AdUser $_.Manager -Properties Mail).Mail } },
@{Label = "User Title"; Expression = { $_.Title } },
@{Label = "E-mail"; Expression = { $_.Mail }} |
Export-Csv -Encoding UTF8 -Path $Csvfile -NoTypeInformation

# 清理旧文件:保留最新的4个,删除更早的
$maxVersions = 4
$allCsvFiles = Get-ChildItem -Path $Path -Filter "******_User_List_*.csv" | Sort-Object CreationTime -Descending
if ($allCsvFiles.Count -gt $maxVersions) {
    $allCsvFiles | Select-Object -Skip $maxVersions | Remove-Item -Force
}

注意事项

  • 确保脚本运行账号对目标网络文件夹有删除权限
  • 若文件创建时间不准确,可改用LastWriteTime替代CreationTime排序
  • 原脚本中获取Manager属性的代码可优化(避免重复调用Get-ADUser),但不影响清理逻辑的实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:42:32