Пакетный скрипт, объединяющий PDF-файлы с pdftk

Заранее благодарим за любую оказанную помощь.

После поиска во всех относительных потоках и поиска в Google я не могу найти решение для вывода имени переменной для слияния двух PDF-файлов.

Итак, у меня есть сотни PDF-файлов, которые мне нужно объединить (по два за раз) в папку c:/test.

Файлы расположены, как показано ниже

Company Name Invoice No 123456
Company Name Invoice No 123456 details

Теперь мне удалось переместить два файла за раз в другую папку и объединить их, но, похоже, я не могу получить желаемое выходное имя, после которого я должен поставить дату окончания недели впереди (или в конце, а не суетился) имени первого объединенного файла. Ниже приведен код, который у меня есть до сих пор, который работает, но имя выходного файла пусто, но создается.

Очень новичок в пакетном скриптинге и буду признателен за любую помощь :)

@echo off

setlocal enableextensions enabledelayedexpansion
set pdftk=C:\Program Files (x86)\PDFtk Server\bin\pdftk.exe

set Source=C:\test
set Target=C:\test\test2
set num=2
set filenumber=1

for /F "tokens=1,2 delims=:" %%f in ('dir /b /a-d "%source%\*.pdf"  ^|     findstr /n "^" ') do (
    if %%f leq %num% (
        copy "%source%\%%g" "%target%" /y > nul 
    ) else goto endCopy
)

:endCopy
endlocal
for /F "tokens=1,2 delims=:" %%f in ('dir /b /a-d "%target%\*.pdf"  ^|      findstr /n "^" ') do (
    if %%f leq %filenumber% ( set file=%%~nA
   )
)
pdftk *.pdf cat output we_19_9_2017_%file%.pdf

person manitou    schedule 16.09.2017    source источник
comment
Использование неправильной метапеременной. установить файл=%%~ng   -  person Squashman    schedule 16.09.2017
comment
Спасибо, но, к сожалению, я все еще получаю пустой вывод для переменной %file%   -  person manitou    schedule 16.09.2017
comment
Удалите строки SETLOCAL и ENDLOCAL. Они не нужны для кода, который вы используете. Переменная %filenumber% больше не определяется после оператора endlocal.   -  person Squashman    schedule 16.09.2017


Ответы (2)


В endCopy вы пытаетесь получить имя A, тогда как вы выполняете итерацию с f. Используйте set file=%%~nf для установки имени файла или set file=%%~ng для второго файла.

И переместите endlocal в конец, чтобы расширить !file! в конце скрипта, как это (обратите внимание на !):

:endCopy
set "cmd=dir /b /a-d "%target%\*.pdf" ^| findstr /n "^""
for /F "tokens=1,2 delims=:" %%f in ('%cmd%') do if %%f leq %filenumber% set file=%%~nf

pdftk *.pdf cat output we_19_9_2017_!file!.pdf
endlocal

Узнайте больше об DelayedExpansion по адресу: https://ss64.com/nt/delayedexpansion.html.

person sohaib    schedule 16.09.2017
comment
Спасибо @S.Ahmad за информацию и предложение, я изменил свой код, как вы предложили, но я все еще получал пустой выходной файл. Я запустил ваш код в консоли и получил сообщение об ошибке FINDSTR: нет строк поиска, я пробовал некоторые изменения, но безуспешно ...... есть мысли по поводу ошибки? Цените помощь! - person manitou; 16.09.2017
comment
@manitou в своем скрипте вы передаете двойные кавычки findstr, что возвращает эту ошибку: dir /b | findstr /N "" FINDSTR: No search strings Вы должны добавить строку, которую вы ищете, между "^", например. "file^" - person sohaib; 16.09.2017

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

Также вы устанавливаете переменную пути для pdftk, но не используете ее.
Если этот путь не включен в %path%, его невозможно найти.

Попробуйте это (не проверено)

@echo off
setlocal enableextensions enabledelayedexpansion
set "pdftk=C:\Program Files (x86)\PDFtk Server\bin\pdftk.exe"

set "Source=C:\test"
set "Target=C:\test\test2"
set num=2
set filenumber=1

for /F "tokens=1,2 delims=:" %%f in (
    'dir /b /a-d "%source%\*.pdf" ^| findstr /n "^" '
) do if %%f leq %num% (
    copy "%source%\%%g" "%target%" /y > nul 
) else goto endCopy

:endCopy
endlocal
for /F "tokens=1,2 delims=:" %%f in (
    'dir /b /a-d "%target%\*.pdf" ^|findstr /n "^" '
) do if %%f leq %filenumber% set file=%%~nf

PushD "%Target%"
"%pdftk%" *.pdf cat output we_19_9_2017_%file%.pdf
PopD
person Community    schedule 16.09.2017
comment
Спасибо @LotPings, когда файл выводится, переменная %file% представляется как «1», то есть we_19_9_2017_1. Я делаю что-то неправильно? - person manitou; 16.09.2017
comment
Вы изначально установили номер файла равным единице, последнее, если запрещает увеличивать его, так что вы ожидаете? - person ; 16.09.2017