批处理脚本根据文件夹名称和文件修改日期解压和重命名文件?

问题描述 投票:0回答:1

我在不同的文件夹中有一堆 zip 文件,其中包含多个需要重命名的文件。我在批处理脚本方面没有 0 经验,所以我一直在让副驾驶 AI 帮助我,它让我完成了大约 85% 的工作,但似乎无法让我达到 100%。

上下文: 我有一堆文件夹,名称均为“Sheet1”、“Sheet2”、“Sheet3”等。每个文件夹都包含一个 zip 文件,其中包含不同数量的文件。 我希望脚本进入每个“Sheet”文件夹,并根据以下格式重命名文件: YYYY-MM-DD_{标记}_Sheet#.pdf

日期 (YYYY-MM-DD) 应从文件的修改日期中提取。我现在的脚本就可以很好地做到这一点。

如果原始文件名中包含“eak markup”、“CMS Markups”、“CMS Markup”或“cms markup”,则 {markup} 应替换为“eak markup”或“cms markup”,如下所示合适的。如果文件的原始名称中不包含任何这些内容,则新文件的 {markup} 部分中不应有任何内容。

“Sheet#”应替换为文件夹的名称。

最后,可能有一些文件具有相同的修改日期。在这种情况下,我希望代码在新文件名后附加“_R1”。

我迄今为止开发的代码复制如下:

@echo off
setlocal enabledelayedexpansion

rem Set the base directory
set "baseDir=C:\Users\bkirtland\desktop\SN"

rem Loop through each "Sheet" folder
echo Starting to process folders in %baseDir%...

for /d %%D in ("%baseDir%\Sheet*") do (
    set "foldername=%%~nD"
    echo Found folder: !foldername!
    pushd "%%D"
    
    rem Check for zip files
    if exist *.zip (
        echo Unzipping files in %%D...
        for %%Z in (*.zip) do (
            echo Unzipping %%Z...
            powershell -command "Expand-Archive -Path '%%Z' -DestinationPath '.' -Force"
        )
    ) else (
        echo No zip files found in %%D.
    )

    rem Create a temporary list of PDF files
    set "fileList="
    for %%F in (*.pdf) do (
        set "fileList=!fileList! "%%F""
    )

    rem Process each PDF file from the temporary list
    for %%F in (!fileList!) do (
        echo Processing File: %%F
        
        rem Get the modified date in YYYY-MM-DD format
        for /f "tokens=1-3 delims=/" %%A in ('forfiles /m "%%~nxF" /c "cmd /c echo @fdate"') do (
            set "month=%%A"
            set "day=%%B"
            set "year=%%C"
            set "modDate=!year!-!month!-!day!"
        )
        echo Modified Date: !modDate!
        
        rem Determine the markup
        set "markup="
        echo %%F | findstr /i "eak markup" >nul && set "markup=eak markup"
        echo %%F | findstr /i "CMS Markup" >nul && if not defined markup set "markup=cms markup"
        echo %%F | findstr /i "CMS Markups" >nul && if not defined markup set "markup=cms markup"
        echo %%F | findstr /i "cms markup" >nul && if not defined markup set "markup=cms markup"
        echo Markup: !markup!

        rem Construct the new file name
        if defined markup (
            set "newName=!modDate!_!markup!_!foldername!.pdf"
        ) else (
            set "newName=!modDate!_!foldername!.pdf"
        )
        
        rem Handle naming conflicts
        set "counter=0"
        :checkConflict
        if exist "!newName!" (
            set /a counter+=1
            if defined markup (
                set "newName=!modDate!_!markup!_!foldername!_R!counter!.pdf"
            ) else (
                set "newName=!modDate!_!foldername!_R!counter!.pdf"
            )
            goto checkConflict
        )
        
        echo New File Name: "!newName!"
        
        rem Rename the file
        ren "%%F" "!newName!"
        
        rem Pause for debugging
        pause
    )

    popd
)

echo Done!
pause

当我运行脚本时,它直接跳转到我的文件夹“Sheet10”。它可以很好地解压缩 zip 文件,并且该特定 zip 文件夹中的两个文件被命名为: 10 典型横截面 - 路线 6_eak markup_2024-10-15.pdf 608020_BR2(SN_Route 6 - 典型引道断面_SH)-TYP CROSS SECTION.pdf

这是我运行脚本时命令提示符显示的内容:

Starting to process folders in C:\Users\bkirtland\desktop\SN...
Found folder: Sheet10
Unzipping files in C:\Users\bkirtland\desktop\SN\Sheet10...                                                             Unzipping 10 TYPICAL  CROSS SECTION - ROUTE 6_eak markup_2024-10-15.zip...                                              Processing File: "10 TYPICAL  CROSS SECTION - ROUTE 6_eak markup_2024-10-15.pdf"
Modified Date: 2024-10-15
Markup: eak markup
New File Name: "2024-10-15_eak markup_Sheet10.pdf"
The syntax of the command is incorrect.
Press any key to continue . . .

似乎在重命名文件时遇到了问题(第 76 行)。它正确构建名称,但不会重命名文件。有什么想法吗??

batch-file
1个回答
0
投票

从根本上来说,在

:checkConflict
(带括号的命令序列)中不能有标签 (
code block
) - 它会扰乱循环的处理。

使用

    ...
    set "counter=0"
    CALL :checkConflict
    
    echo New File Name: "!newName!"

    ...

在循环内并且

echo Done!
pause

GOTO :eof

:checkConflict
if exist "!newName!" (
 set /a counter+=1
 if defined markup (
  set "newName=!modDate!_!markup!_!foldername!_R!counter!.pdf"
 ) else (
  set "newName=!modDate!_!foldername!_R!counter!.pdf"
 )
 goto checkConflict
)
GOTO :eof

最后。

call
执行内部子例程(
call :label
- 调用
label
将执行
external* subroutine from file 
label.bat`)

goto :eof
(需要冒号;标签
:eof
定义为文件结尾,退出子例程/主线)只是终止(子例程的)处理。

...其余的应该一帆风顺。

© www.soinside.com 2019 - 2024. All rights reserved.