我在不同的文件夹中有一堆 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 行)。它正确构建名称,但不会重命名文件。有什么想法吗??
从根本上来说,在
: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
被定义为文件结尾,退出子例程/主线)只是终止(子例程的)处理。
...其余的应该一帆风顺。