我有每天生成的多个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
我期望这样的事情
获取pdf文件名
2019年5月1日-精细-CS0000.pdf
2019年5月2日-精细-CS0000.pdf
03May2019-Fine-CS0000.pdf
输入一个我要在No 1的pdf文件名中添加的INPUT2(包含4个数字)
输入收据编号:5680
然后,组合的INPUT1和INPUT2成为新文件名。
2019年5月1日-Fine-CS00005680.pdf
LOOP要求用户输入新的收据编号,这将重命名第二个pdf文件,依此类推。
注意:每个pdf文件名都包含格式。
答案 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
解释了排序顺序。