Batch Print - Batch Script - условие findstr для цикла for - PullRequest
0 голосов
/ 14 марта 2012

Моя проблема заключается в том, чтобы загрузить PDF-файлы и отправить их все на принтер.

Я загружаю через ftp правильно, и все файлы попадают в мой локальный каталог:

Имя файла = FtpScript.ftp

open ftp.domain.com
username
password
!:--- FTP commands below here ---
lcd local/Directory
cd  /remote/Directory
binary
mget "*.pdf"
prompt
disconnect
quit

Затем этот пакетный файл вызывает скрипт ftp.

Имя файла = retrieve_print.bat

@ftp -i -s:"C:\Scripts\FtpScript.ftp"

set mm=%date:~4,2%
set dd=%date:~7,2%
set yy=%date:~-4%

IF NOT EXIST {C:\Users\print_test2\print_%mm%_%yy%}( mkdir C:\Users\print_test2\print_%mm%_%yy% )

IF NOT EXIST C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt ( 
    @echo Uploaded Text -- Date: %date% Time : %time%  >>     C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt   
) 
IF NOT EXIST     C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt ( 
    @echo Printed Text -- Date: %date% Time : %time% >>     C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt 
)

REM LOOP THROUGH PDFs THAT WERE UPLOADED AND INSERT THE NAMES INTO THE UPLOADED_*_*.txt TEXT     FILE 
FOR %%x in (  C:\Users\print_test2\print_%mm%_%yy%\*.pdf )  DO     (
    findstr "%%~nxx"     C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt
    @ECHO Error level = %errorlevel%
    @ECHO %%~nxx 
    @pause
    IF NOT %errorlevel% == 0 (
        @echo %%~nxx >>     C:\Users\print_test2\print_%mm%_%yy%\uploaded_%mm%_%dd%_%yy%.txt
    )
)

REM LOOP THROUGH PDFs THAT WERE UPLOADED AND PRINT THEM, THEN INSERT THEM INTO THE PRINTED_*_*.txt TEXT FILE TO SUPPRESS DUPLICATE PRINTS 
FOR %%x in (  C:\Users\print_test2\print_%mm%_%yy%\*.pdf )  DO     (
    findstr "%%~nxx"     C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt
    @ECHO Error level = %errorlevel%
    @ECHO %%~nxx 
    IF NOT %errorlevel% == 0 (
        rem PRINT FUNCTION
        @echo %%~nxx >>     C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt
    )
) 

Текстовые файлы генерируются неправильно.Я думаю, что я мог бы перебрать файлы, доступные в каталоге print_test2 / print_% mm% _% yy% для всех файлов, которые я получил через ftp, и записать их в текстовый файл.

Проблема становится очевидной, когда я пытаюсь запустить сценарий второй раз, когда в текстовых файлах есть имена файлов.Я ожидаю, что функция findstr выдаст% errorlevel% от 0, но она не обнаруживает строку в текстовом файле и снова добавляет все имена файлов как в загруженные, так и в печатные текстовые файлы.

Есть ли лучший способ регистрации полученных файлов и печати PDF-файлов только один раз?

Спасибо

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Ваша проблема в том, что значение %errorlevel% берется внутри для for, поэтому оно заменяется значением errorlevel, имеющим перед тем, как войдет в цикл for.Чтобы взять значение current , которое в каждом из уровней ошибки имеет для каждой итерации , необходимо использовать расширение отложенной переменной, то есть заключить значение в восклицательные знаки вместо процентов: !errorlevel! И вставить эту строкув начале вашей программы:

setlocal EnableDelayedExpansion

Чтобы решить эту проблему, попробуйте следующее:

set name=Value before FOR
for %%f in (*.pdf) do (
   set name=%%f
   echo %name%
)

и попробуйте снова изменить echo %name% на echo !name!.

0 голосов
/ 14 марта 2012

Несколько идей для рассмотрения:

  1. Я не уверен, что уровень ошибки после вашей команды FINDSTR будет ненулевым только потому, что строка не найдена.
  2. Даже если уровень ошибки не равен нулю, я думаю, что в тот момент, когда вы выполняете следующую команду, устанавливается новый уровень ошибки из этой команды.
  3. В вашем операторе IF вам может понадобиться заключить две стороныВаша проверка на равенство в разделителях, например, IF NOT "%errorlevel%" == "0"
  4. Вы можете подумать о том, чтобы сделать свой список отличным после того, как в него будут выведены все имена файлов.Это сэкономит вам некоторую логику при входе. Некоторый код для создания списка, отличного от DOS, описан здесь: http://www.dullsharpness.com/2010/10/01/create-a-distinct-ordered-list-from-an-unordered-duplicate-list-using-ms-dos/
  5. Если вы используете методы из # 4, вы можете просто сделать список каталоговв ваш файл (как показано ниже), а затем создайте уникальные методы, используя # 4.

dir/b C:\Users\print_test2\print_%mm%_%yy%\*.pdf >> C:\Users\print_test2\print_%mm%_%yy%\printed_%mm%_%dd%_%yy%.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...