如何在文件已存在时递增文件名?PowerShell脚本咨询
实现PowerShell导出Excel时的文件名递增
直接修改原脚本,添加文件名递增逻辑的同时优化AD查询效率,最终代码如下:
$Users = @" SamAccountName; FloydS AdamS SvacouM FloydS "@ | Convertfrom-csv -Delimiter ";" $FilePath = "C:\TEMP\" $date = Get-Date -Format yyyy-MM-dd # 确保输出目录存在,避免因目录缺失报错 if (-not (Test-Path -Path $FilePath)) { New-Item -ItemType Directory -Path $FilePath | Out-Null } Foreach ($User in $Users) { # 一次性获取用户所需属性,减少重复AD查询 $userObj = Get-ADUser $User.SamAccountName –Properties MemberOf, Name $userName = $userObj.Name # 生成基础文件名并拼接完整路径 $baseFileName = "$userName ($date).xlsx" $fullPath = Join-Path -Path $FilePath -ChildPath $baseFileName # 文件名递增逻辑:如果文件已存在,添加数字后缀直至找到可用路径 $counter = 1 while (Test-Path -Path $fullPath) { $newFileName = "$userName ($date)-$counter.xlsx" $fullPath = Join-Path -Path $FilePath -ChildPath $newFileName $counter++ } # 导出用户所属安全组到目标Excel文件 $userObj.MemberOf | Get-ADGroup | Select-Object name | Export-Excel -Path $fullPath -WorksheetName $date -AutoSize -AutoFilter -TableStyle Medium2 } Write-Host "Done!"
关键逻辑说明
- AD查询优化:将原脚本中两次
Get-ADUser调用合并为一次,减少对域控制器的重复请求,提升执行效率。 - 目录检查:自动创建不存在的输出目录,避免导出时因路径无效失败。
- 递增文件名生成:
- 先按原格式生成基础文件名并检查是否存在;
- 若文件已存在,在文件名末尾追加
-1、-2这类递增数字,循环检查直到找到未被占用的路径; - 使用
Join-Path处理路径拼接,避免手动拼接时的分隔符错误。
修改后,重复导出同一用户的报告时,会自动生成类似Floyd Smith (2024-05-20).xlsx、Floyd Smith (2024-05-20)-1.xlsx的递增文件名,不会覆盖原有文件。
内容的提问来源于stack exchange,提问作者ak2595
相关产品推荐
相关产品推荐

