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

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

关键修改说明

  1. 把$scanObject的创建移到循环内部:每次循环都新建一个独立的对象,确保每个文件的统计信息都能被正确封装,这是解决CSV为空的核心。
  2. 修正变量笔误和判断逻辑:把$ie改成$i,把$newFileName的判断改成$orderID,让删除标记功能正常工作。
  3. 简化路径和时间处理:直接用$i.FullName打开文件,用$i.CreationTime直接获取创建时间,避免冗余的Get-ItemProperty调用。
  4. 优化扫描仪类型判断:用switch语句替代if-else,增加Unknown默认值,避免类型判断遗漏。
  5. 重置删除原因变量:每次循环开始时把$reasonForDeletion设为$null,确保不会携带上一次的残留值。
  6. 添加错误处理:给Stop-Process加-ErrorAction SilentlyContinue,避免没有Acrobat进程时出现报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:01:33