PowerShell脚本导出CSV为空求助:批量重命名PDF并收集文件信息
问题排查:PowerShell脚本导出CSV为空的解决方法
先看你遇到的情况:遍历PDF重命名的功能正常,但统计信息的CSV是空的,这是因为代码里几个对象处理的逻辑出错了,我帮你梳理下问题和修正方案:
核心问题分析
- 对象创建位置错误:你在循环外只创建了一个
$scanObject,然后试图用$scanObject[$counterID]来索引赋值,但$scanObject是单个System.Object实例,不是数组,这种赋值方式根本不会生效,最后$scanArray里自然没有任何数据,导出的CSV就为空了。 - 变量笔误:代码里的
$ie.Length应该是$i.Length,这个笔误会导致Lexmark的判断永远不触发,还可能产生隐藏错误。 - 路径处理冗余:
$i本身就是FileInfo对象,直接用$i.FullName就能获取完整路径,不需要反复用Resolve-Path。 - 判断逻辑错误:你用
$newFileName -eq "delete"做判断,但实际用户输入的是$orderID,这个条件永远不会触发,应该改成$orderID -eq "delete"。 - 变量未重置:
$reasonForDeletion没有在每次循环初始化,会保留上一次的值,导致统计信息不准确。
修正后的完整代码
Add-Type -AssemblyName Microsoft.VisualBasic $folderpath = 'file path' # 替换成你的实际文件夹路径 $items = Get-ChildItem -Recurse $folderpath -Filter *.pdf $counterID = 0 $amountOfScans = $items.Count $scanArray = @() foreach( $i in $items) { # 每次循环新建一个统计对象,这是解决CSV为空的关键! $scanObject = New-Object System.Object $counterID++ # 打开PDF文件 Start-Process -FilePath $i.FullName Start-Sleep -Seconds 1 # 获取新文件名输入 $orderID = [Microsoft.VisualBasic.Interaction]::InputBox("Enter the new file name for scan $counterID / $amountOfScans :", "重命名", $i.Name) $reasonForDeletion = $null # 每次循环重置删除原因,避免残留值 # 处理删除标记逻辑 if ($orderID -eq "delete"){ $reasonForDeletion = [Microsoft.VisualBasic.Interaction]::InputBox("Enter a reason for marking $($i.Name) for deletion :", "删除原因") } # 判断扫描仪类型,用switch更清晰 $typeOfScanner = switch($i.Name.Length){ 24 { "Xerox" } 33 { "Lexmark" } default { "Unknown" } } # 获取文件时间信息,简化处理 $DateCreated = $i.CreationTime.ToString("yyyy-MM-dd HH:mm:ss") $DateModifiedTotal = Get-Date -Format "dd/MM/yyyy HH:mm:ss" # 给统计对象添加属性 $scanObject | Add-Member -type NoteProperty -name TempName -Value $i.Name $scanObject | Add-Member -type NoteProperty -name NewName -Value $orderID $scanObject | Add-Member -type NoteProperty -name TypeOfScanner -Value $typeOfScanner $scanObject | Add-Member -type NoteProperty -name DateCreated -Value $DateCreated $scanObject | Add-Member -type NoteProperty -name DateModified -Value $DateModifiedTotal $scanObject | Add-Member -type NoteProperty -name ReasonForDeletion -Value $reasonForDeletion # 将对象添加到数组中 $scanArray += $scanObject # 关闭PDF阅读器,加错误处理避免无进程时报错 Stop-Process -Name "Acro*" -ErrorAction SilentlyContinue } # 导出CSV,指定UTF8编码避免乱码 $scanArray | Export-Csv -Path "C:\Scans\renamed_stats.csv" -NoTypeInformation -Encoding UTF8
关键修改说明
- 把
$scanObject的创建移到循环内部:每次循环都新建一个独立的对象,确保每个文件的统计信息都能被正确封装,这是解决CSV为空的核心。 - 修正变量笔误和判断逻辑:把
$ie改成$i,把$newFileName的判断改成$orderID,让删除标记功能正常工作。 - 简化路径和时间处理:直接用
$i.FullName打开文件,用$i.CreationTime直接获取创建时间,避免冗余的Get-ItemProperty调用。 - 优化扫描仪类型判断:用
switch语句替代if-else,增加Unknown默认值,避免类型判断遗漏。 - 重置删除原因变量:每次循环开始时把
$reasonForDeletion设为$null,确保不会携带上一次的残留值。 - 添加错误处理:给
Stop-Process加-ErrorAction SilentlyContinue,避免没有Acrobat进程时出现报错。
内容的提问来源于stack exchange,提问作者Logan W
相关产品推荐
相关产品推荐

