Показать полную графическую версию : [решено] Автоматическая печать файлов из 1ой папки
aRHangel2013
29-08-2012, 19:27
Доброе время суток! Граждане программисты, подскажите как реализовать мою задачку:
есть некая прога, которая создает *.prt-0, *.prt-1, *.prt-2, *.prt-3 (это обычные txt-эшки) и размещает их по пути [сетевой диск:]\\год\месяц\день\. Нужно автоматически распечатать файлы на локальном принтере (LPT) (как только они появляются) из этой папки. Еще проблема в том, что запись и изменение в папке [сетевой диск:]\\год\месяц\день\ запрещено.
я кое что нарыл\пепеделал:
@Echo Off
set $dd=%DATE:~0,2%
set $mm=%DATE:~3,2%
set $yyyy=%DATE:~6,4%
Set $SRC=y:\"%$yyyy%"\"%$mm%"\"%$dd%"\ToPrint\
Set $DST=y:\"%$yyyy%"\"%$mm%"\"%$dd%"\ToPrint\old\
Set $MSK=*.prt-0
If Not Exist "%$SRC%" MD "%$SRC%"
If Not Exist "%$DST%" MD "%$DST%"
:LOOP
If Exist "%$SRC%\%$MSK%" For %%i In ("%$SRC%\%$MSK%") Do (
notepad /P "%%i"
MOVE /Y "%%i" "%$DST%" >Nul
Echo файл "%%~nxi" обработан
)
Ping -n 2 127.0.0.1 >Nul
GoTo LOOP
но это не подошло, т.к. нельзя делать изменения в source папке.
и имена файлов идут просто счетчиком по очереди, но с маленьким подвыподвертом
... когдато там начались
01168608.prt-1
01168608.prt-2
01168609.prt-0
01168610.prt-0
01168611.prt-0
~~~~~~~~~~~
01168649.prt-0
01168652.prt-1
01168652.prt-2
01168652.prt-3
01168650.prt-0
01168651.prt-0
... ну и продолжаются
Molchune
30-08-2012, 15:55
Ну в принципе у тебя все в батнике и написано
Чуть доработать надо было и все
Echo Off
set file=file
set $dd=%DATE:~0,2%
set $mm=%DATE:~3,2%
set $yyyy=%DATE:~6,4%
Set $Folder=y:\"%$yyyy%"\"%$mm%"\"%$dd%"
: print
for /f "delims=" %%d in ('dir /b/a-d/od "%Folder%\*.prt"') do set "$d=%%~nxd"
echo %$d%
echo file=%file%
if %file%==%$d% (
ping 127.0.0.1 -n 2 >>null
Set file=%$d%
echo "noprint"
goto print
echo 1) else (
Set file=%$d%
ping 127.0.0.1 -n 2 >>null
echo print %Folder%\%$d%
print /d:myprintername %Folder%\%$d%
goto print)
Пояснения:
set file=file
нужно только для первого if.
скрипт берет последний созданный файл исравнивает его с file если равно то не печатет если не равно то печатает.
строчкой ping 127.0.0.1 -n 2 >>null указываешь частоту проверки.
aRHangel2013
31-08-2012, 10:18
Почемуто прога не печатает новый, поповший в папку, файл; и если там 2-3 файла сразу, печатается только 1й. значит перебор не работает. и не запускается при пустой source папке. ща попробую разобраться. подскажи, что за %$d% и как она работает?
Molchune, спасибо за код. есть хоть за что зацепиться и дорабоать
Molchune
31-08-2012, 11:55
%$d% »
просто переменная цикла.
если там 2-3 файла сразу, печатается только 1й »
в принципе так и должно быть, если в единицу времени попало несколько документов.
Значи смотри(там же спецом оставлены echo чтобы видно было что за переменные)
Смотри этим вот
for /f "delims=" %%d in ('dir /b/a-d/od "%Folder%\*.prt"') do set "$d=%%~nxd"
мы получаем последний добавленный файл. если в момент времени их будет два файлы то уж только последний он распечатет.
Смысл был в том, что файло сыпется меньше чем 1 раз в секунду. тогда берется последний созданный файл и печатается.
можно тогда задержку убрать (ping) мб будет лучше.
Если чаще, то тогда надо сравнивать содержимое папки с какой то величиной, то есть надо будет сохранять данные(dir/a-d/b ) b и сравнивать на прошлый момент времени а разницу печатать (у тебя было условие не сохраняя) хотя можно мб сохранять в %temp%?
aRHangel2013
31-08-2012, 12:55
бывает попадают файлы и по 3 сразу
01168685.prt-3 29.08.2012 21:19:43
01168685.prt-2 29.08.2012 21:19:43
01168685.prt-1 29.08.2012 21:19:43
поэтому, скорее всего, нужно толи по имени.расширению сравнивать, толи весь список, и печатать разницу.
но вот все равно не печатает при добавлении в папку нового файла
D:\DOCs\BAT>Echo Off
2.prt-0
file=file
print y:\"2012"\"08"\"31"\2.prt-0
y:\2012\08\31\2.prt-0 в настоящее время печатается.
2.prt-0
file=2.prt-0
"noprint"
2.prt-0
file=2.prt-0
"noprint"
~~~~~~~~~~
2.prt-0
file=2.prt-0
^C"noprint"
Завершить выполнение пакетного файла [Y(да)/N(нет)]?
Molchune
31-08-2012, 13:27
хз.. я когда ручками создаю файл в папке он пишет что будет печатать.
а отсортируй в папке файлы по дате создания. какой последний будет? Такой же как и в скрипте?
megaloman
01-09-2012, 12:25
@echo Off
cls
Set Share0="E:\DDDDD\*.prt-0"
Set Share1="E:\DDDDD\*.prt-1"
Set Share2="E:\DDDDD\*.prt-2"
Set Share3="E:\DDDDD\*.prt-3"
Set Index=%~n0.EXCLUDE
if Not Exist %Index% Echo %Index% >%Index%
Call :Printer %Share0%
Call :Printer %Share1%
Call :Printer %Share2%
Call :Printer %Share3%
GoTo:Eof
:Printer
FOR /F "usebackq delims=" %%i IN (`xcopy /L /S /EXCLUDE:%Index% %1 "%Tmp%\" 2^>nul^`) DO (
If Exist "%%i" (
echo %%i Здесь надо файл распечатать
echo %%i >>%Index%
)
) Не очень понял Ваш сетевой путь, замените мои пути "E:\DDDDD\*.prt-0" на свои сетевые. И вместо
echo %%i Здесь надо файл распечатать
нарисуйте свою команду для распечатки.
Идея решения:
Команда xcopy /L выдаёт список файлов (реальное копирование не происходит) за исключением списка файлов, указанных в файле под ключом /EXCLUDE. Кстати, /S указывает на просмотр в поддиректориях, соответственно заботиться о указании в пути папки с датой не обязательно (если, конечно, по сетевому пути не содержится других данных.
Батник делает рядом с собой файл с именем батника и расширением EXCLUDE (имя и расширение можете сами придумать (в переменной Index), я решил, что так логичнее ). И далее в этот файл записываются полные имена уже обработанных файлов. То есть, батник должен быть в том месте, где у Вас есть права на запись, для обрабатываемых файлов расположение в месте для чтения.
То есть в этом файле хранится список всех ваших обработанных файлов, при повторном запуске батника они уже обрабатываться не будут.
Я не привязываюсь к дате файлов, я анализирую, обрабатывались ли они. Можно, конечно, формировать пути к файлам на основе текущей даты, но это уж Вам решать, моему батнику это никак не противоречит
Как организовать цикл по времени - дело вкуса. Я бы поместил батник в назначенные задания.
aRHangel2013
03-09-2012, 23:29
я примерно так и собирался сделать (это наверно один подходящий вариант) : проверять папку на наличие файлов, составлять список файлов, печатать, потом снова проверять папку, и сверять со списком, разницу печатать. поставить все на scheduler.
echo %%i Здесь надо файл распечатать
чет я не пойму что сюда написать????
надо как то так ???
print /D:\\comp\hp1320 %Share0%\%Tmp%
%Share% - это ж путь к файлу, а надо печатать разницу
я вот конкретно не пойму, как задать на печать "разнину" между реальным списком файлов, и уже напечатанным???
Molchune
04-09-2012, 10:08
%Share% - это ж путь к файлу, а надо печатать разницу
я вот конкретно не пойму, как задать на печать "разнину" между реальным списком файлов, и уже напечатанным??? »
в данном скрипте тебе надо просто указать
print /D:\\comp\hp1320 %%i
Так как в переменной %%i уже содержится полный путь до файла
megaloman
04-09-2012, 12:34
я вот конкретно не пойму, как задать на печать "разнину" между реальным списком файлов, и уже напечатанным??? Вам не надо задавать никакой разницы: имена файлов, уже напечатанных, хранятся в файле, который делает батник, а о именах ненапечатанных файлов, которые выдаст For в переменную %%i, позаботится xcopy c ключом /EXCLUDE, в тот же файл там же запишется имя файла после печати. Единственно, надёжнее взять в команде печати переменную в кавычки "%%i"То есть в этом файле хранится список всех ваших обработанных файлов, при повторном запуске батника они уже обрабатываться не будут.
aRHangel2013
04-09-2012, 17:26
Блин, работает!!! Эврика! теперь я начинаю немного понимать. Спасибо большое.
PS Надо будет в будущем допридумать hide режим и еще что нидь.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.