2012-03-14 5 views
0

Моя проблема заключается в том, чтобы загрузить pdf-файлы и отправить их всем на принтер.Batch Print - Batch Script - findstr condition for for loop

загрузить через FTP правильно и все файлы идут в мой локальный каталог:

File Name = 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-файлов только один раз?

Благодаря

ответ

3

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

setlocal EnableDelayedExpansion 

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

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

, а затем повторите попытку изменения echo %name% по echo !name!.

+0

Провел некоторое время с этим циклом и не знал, что происходит. Это точно зафиксировало мою ошибку. Спасибо за помощь Аачини. – Alex

0

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

  1. Я не уверен, что Равно после команды Findstr будет отличен от нуля только потому, что строка не найдена.
  2. Даже если errorlevel отличен от нуля, я думаю, что в тот момент, когда вы выполняете следующую команду, устанавливается новый уровень ошибок из этой команды.
  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

+0

1. Да, FINDSTR возвращает ненулевое значение уровня ошибок, если строка не была найдена. 2. В .BAT-файлах команды ECHO и PAUSE не изменяют уровень ошибок. 3. При сравнении значений уровня ошибок разделители не нужны, только если значения могут содержать пробелы или другие специальные символы. – Aacini

+0

Эй, Марк, техника в 4 объясняет, что setlocal EnableDelayedExpansion очень хорошо. Особенно с http://www.robvanderwoude.com/variableexpansion.php. Благодаря! – Alex