从输入文本批量重命名多个pdf文件

时间:2019-05-09 09:54:42

标签: windows batch-file rename

我有每天生成的多个pdf文件收据,然后我需要在付款后根据其收据编号重命名此文件。而是手动手动重命名它们,我想使用批处理脚本来节省时间。因此每天都有不同的收据编号。

我的想法是一个脚本,要求用户输入收据编号。用户输入第一个收据编号后,脚本将随后重命名第一个pdf文件(例如5月1日),然后脚本将询问第二天收据编号(5月2日)并重命名为第二个pdf文件。每天使用wkhtmltopdf脚本自动生成pdf。也有可能那天没有收据(也许没有罚款),但wkhtmltopdf仍然保存一个空的pdf文件。所以我需要跳过这个。

仅更新一个PDF文件的工作代码。如何处理下一个pdf文件?

@echo off
set /p str= Enter receipt no:
for %%a in ("*.pdf") do (

echo  Preview: %%~na%str%
ren "%%~a" "%%~Na%Str%%%~Xa"
)
PAUSE

我期望这样的事情

  1. 获取pdf文件名

    2019年5月1日-精细-CS0000.pdf

    2019年5月2日-精细-CS0000.pdf

    03May2019-Fine-CS0000.pdf

  2. 输入一个我要在No 1的pdf文件名中添加的INPUT2(包含4个数字)

    输入收据编号:5680

  3. 然后,组合的INPUT1和INPUT2成为新文件名。

    2019年5月1日-Fine-CS00005680.pdf

  4. LOOP要求用户输入新的收据编号,这将重命名第二个pdf文件,依此类推。

注意:每个pdf文件名都包含格式。

1 个答案:

答案 0 :(得分:0)

@echo off
setlocal

rem Validate receipt is only digits, set to 1.
set "validate_receipt_is_digits=1"

rem Order by month in name i.e. Jan, Feb ... or order by file date, set to 1.
set "order_by_name=0"

:Main

rem Set pattern to use.
set "pattern=/od *.pdf"

if "%order_by_name%" == "1" set pattern=*Jan*.pdf *Feb*.pdf^
 *Mar*.pdf *Apr*.pdf *May*.pdf *Jun*.pdf *Jul*.pdf^
 *Aug*.pdf *Sep*.pdf *Oct*.pdf *Nov*.pdf *Dec*.pdf

rem Get the mode and name of the folder of the current directory.
if exist receipts.txt (
    set "mode=SemiAuto"
) else set "mode=Manual"

for %%A in ("%cd%") do set "folder=%%~nxA"

echo %mode% mode in folder "%folder%".
echo(

rem Prompt to continue with pdf file renaming.
set "reply=n"
set /p "reply=Start renaming PDF files? [n|y]: "

if /i "%reply%" == "y" (
    echo(
    call :%mode%
)
exit /b 0


:Manual
setlocal enabledelayedexpansion

for /f "delims=" %%A in ('dir /b %pattern%') do (
    rem Clear the console screen.
    cls

    rem Preview pdf name.
    echo Name:    %%~nA

    rem Get receipt number.
    set "reply="
    set /p "reply=Enter receipt no: "

    rem Validate the reply is digits.
    if defined reply (
        if "%validate_receipt_is_digits%" == "1" (
            for /f "delims=1234567890" %%B in ("!reply!") do set "reply="
        )
    )

    rem Rename the pdf file if replied with a receipt number.
    if defined reply (
        set "newname=%%~nA!reply!%%~xA"

        echo Rename: "%%~A" "!newname!"
        ren "%%~A" "!newname!"

        echo Status: Reply used.
    ) else (
        echo Status: Skipped.
    )

    echo(

    rem Allow user to see the status.
    pause
)
exit /b 0


:SemiAuto
setlocal enabledelayedexpansion
set "first_receipt="
set "receipt="

(
    for /f "delims=" %%A in ('dir /b %pattern%') do (
        rem Clear the console screen.
        cls

        rem First receipt number.
        if not defined first_receipt (
            set /p "receipt=" <&3
            set "first_receipt=defined"
        )

        rem Preview pdf name and receipt number.
        echo Name:    %%~nA
        echo Receipt: !receipt!

        rem Get receipt number. Space = current receipt number.
        set "reply="
        set /p "reply=Enter receipt no: "
        if "!reply!" == " " set "reply=!receipt!"

        rem Validate the reply is digits.
        if defined reply if not "!reply!" == " " (
            if "%validate_receipt_is_digits%" == "1" (
                for /f "delims=1234567890" %%B in ("!reply!") do set "reply="
            )
        )

        rem Rename the pdf file if replied with a receipt number.
        if defined reply (
            set "newname=%%~nA!reply!%%~xA"

            echo Rename: "%%~A" "!newname!"
            ren "%%~A" "!newname!"

            if "!reply!" == "!receipt!" (
                echo Status: Receipt used.
            ) else (
                echo Status: Reply used.
            )
        ) else (
            echo Status: Skipped.
        )

        rem Get another receipt number if last number was used.
        if "!reply!" == "!receipt!" set /p "receipt=" <&3

        echo(

        rem Allow user to see the status.
        pause
    )
) 3< receipts.txt
exit /b 0

此代码有2种模式。 如果文件receipts.txt存在,则使用SemiAuto模式, 否则使用手动模式。

在手动模式下,如果未定义回复,则跳过重命名。 如果定义了答复,则将PDF文件重命名为 收据价值。

在SemiAuto模式下,如果未定义回复,则跳过重命名。 如果答复为空格,则从中读取收据编号 receipts.txt用于重命名PDF文件。如果答复是 其他,然后使用该值来重命名PDF文件。

示例receipts.txt内容:

5690
5692
5789
5880
5888

在SemiAuto模式下,如果第一次使用5690重命名, 输入5690或输入 Space ,然后输入5692 将是下一个要使用的收据号,否则5690是 保留用于第二次重命名或第三次重命名等,直到具有 被使用。

如果validate_receipt_is_digits设置为1,则 如果值仅是数字,则仅允许输入。 如果值不是全部,将跳过重命名 数字。有效数字是1234567890中的任何数字。

如果order_by_name设置为1,则文件顺序 在文件名中按月份完成查找 即*Jan*.pdf *Feb*.pdf ...。 此设置不能识别年份。所以01Jan2020 将在01Feb2019之前出现。由于PDF文件是 每天生成一次,默认设置为0,因此订单 按文件日期。查看dir /?/o一起使用d 解释了排序顺序。