Пакетное переименование нескольких файлов PDF из входного текста - PullRequest
0 голосов
/ 09 мая 2019

У меня есть несколько чеков в формате pdf, которые генерируются ежедневно, после чего мне нужно переименовать этот файл в соответствии с номером квитанции после оплаты.Вместо того, чтобы вручную переименовывать их по очереди, я думаю использовать пакетный скрипт, чтобы сэкономить время.Поэтому каждый день будет иметь другой номер квитанции.

Моя идея - это скрипт, который попросит пользователя ввести номер квитанции.После того, как пользователь введет первый номер квитанции, скрипт затем переименует первый файл PDF (например, 1 мая), затем скрипт запросит номер квитанции второго дня (2 мая) и переименует во второй файл PDF.PDF создаются автоматически, используя скрипт wkhtmltopdf ежедневно.Также есть возможность, что в тот день не будет квитанции (может быть, штраф не собран), но 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

    01May2019-Fine-CS0000.pdf

    02May2019-Fine-CS0000.pdf

    03May2019-Fine-CS0000.pdf

  2. Введите INPUT2 (содержит 4 числа), который яхотите добавить в имя файла pdf номер 1

    Введите номер чека: 5680

  3. Затем объединенные INPUT1 и INPUT2 станут новым именем файла.

    01May2019-Fine-CS00005680.pdf

  4. LOOP, чтобы попросить пользователя ввести новый номер квитанции, затем будет переименован второй файл PDF и т. Д.

Примечание. Каждое имя файла pdf содержит формат.

1 Ответ

0 голосов
/ 11 мая 2019
@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 или введя Пробел , тогда 5692 будет следующим номером квитанции, в противном случае 5690 сохраняется для 2-го переименования или 3-гопереименовывайте и т. д. до тех пор, пока оно не будет использовано.

Если для validate_receipt_is_digits установлено значение 1, допускается только один ввод, если значение состоит только из цифр.Переименование будет пропущено, если значение не всех цифр.Допустимые цифры: 1234567890.

Если для order_by_name установлено значение 1, порядок поиска файлов определяется по месяцу в имени файла, т.е. *Jan*.pdf *Feb*.pdf ....Этот параметр не распознает годы.Так что 01Jan2020 придет раньше 01Feb2019.Поскольку файлы PDF создаются ежедневно, по умолчанию установлено значение 0, поэтому порядок будет по дате файла.Просмотрите dir /? об использовании /o с d, который объясняет порядок сортировки.

...