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

PowerShell批量重命名xls脚本适配新文件名格式报错修复求助

问题根因

原有正则(\b\w+\b).(\d+[.]\d+[.]\d+)仅适配旧文件名「前缀名+空格+点分日期」的结构,新文件名改为「前缀名直接拼接8位日期」后,正则匹配失效,$fn数组为空,调用Get-Date时传入空参数触发报错,后续逻辑生成非法文件名_.xls,且未做容错直接删除源文件导致数据丢失。

解决方案

修改后脚本同时兼容新旧命名格式,新增容错逻辑避免源文件误删,完整代码如下:

# 变量定义
$srcFld      = "\\domain\MC_REPORT\INCOMING"
$arcFld      = "\\domain\MC_REPORT\ARC"
$UnsortFld   = "\\domain\MC_REPORT\UNSORT"
$mcgruzFld   = "\\domain\MC_REPORT\RAIL_RUN_DATE"
$mcdatcFld   = "\\domain\MC_REPORT\DEMURRAGE_AT_THE_CUSTOMS"
$demurrFld   = "\\domain\MC_REPORT\DEMURRAGE"
$prim43Fld   = "\\domain\MC_REPORT\FLAT_CAR_PRICE_GROUP"
$podsylFld   = "\\domain\MC_REPORT\PODSYL"
$pogruzFld   = "\\domain\MC_REPORT\POGRUZKA"
$claimsFld   = "\\domain\MC_REPORT\CLAIMS"
$dislzvFld   = "\\domain\MC_REPORT\DISLZV"
$renummFld   = "\\domain\MC_REPORT\RENUM"
$kontdislFld = "\\domain\MC_REPORT\KONTDISL"

# 兼容新旧格式的正则:分别捕获前缀、旧格式点分日期、新格式8位日期
$regex = "^(\w+?)(?:\s(\d{2}\.\d{2}\.\d{4})|(\d{8}))_"

# 重命名逻辑
Get-ChildItem $srcFld -Filter *.xls | ForEach-Object {
    $file = $_
    $destFld = $UnsortFld
    $filenew = $file.Name # 匹配失败时默认用原文件名归档到 UNSORT

    if ($file.Name -match $regex) {
        $prefix = $matches[1]
        # 优先读取新格式8位日期,否则转换旧格式点分日期
        if ($matches[3]) {
            $dateStr = $matches[3]
        } else {
            try {
                $dateStr = Get-Date $matches[2] -Format yyyyMMdd -ErrorAction Stop
            } catch {
                $prefix = $null
            }
        }

        if ($prefix -and $dateStr) {
            $filenew = "${dateStr}_${prefix}.xls"
            # 匹配目标归档目录
            switch ($prefix)
            {
                renumm { $destFld = $renummFld }
                mcgruz { $destFld = $mcgruzFld }
                mcdatc { $destFld = $mcdatcFld }
                prim43 { $destFld = $prim43Fld }
                demurr { $destFld = $demurrFld }
                podsyl { $destFld = $podsylFld }
                pogruz { $destFld = $pogruzFld }
                dislzv { $destFld = $dislzvFld }
                claims { $destFld = $claimsFld }
                kontdisl { $destFld = $kontdislFld }
                default { $destFld = $UnsortFld }
            }
        }
    }

    # 确认复制成功后再删除源文件,避免数据丢失
    try {
        Copy-Item -Path $file.FullName -Destination "$destFld\$filenew" -ErrorAction Stop
        Copy-Item -Path $file.FullName -Destination "$arcFld\$filenew" -ErrorAction Stop
        Remove-Item -Path $file.FullName -ErrorAction Stop
    } catch {
        Write-Warning "处理文件 $($file.FullName) 失败:$_"
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:36:02