PDA

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


alexansh
15-11-2013, 16:22
Подскажите, пожалуйста, как лучше, проще, оптимальнее осуществить печать из каталогов ?
Например, используя BAT - файл.

Дано, например, на сервере (Windows Server 2008):
1. 5 принтеров в сети и 10 сетевых каталогов
2. Периодически, в каждый из каталогов попадают файлы (по одному или по несколько)

Нужно:
Распечатывать файлы из каждого каталога на определенный принтер и затем удалять распечатанный файл.
Если в каталог попадает сразу несколько файлов, то каждый из этих файлов по очереди нужно распечатать и затем удалить.

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

Iska
15-11-2013, 17:39
Какие именно файлы?

alexansh
17-11-2013, 22:33
Текстовые файлы.

Iska
21-11-2013, 04:33
Смотрите примерную болванку кода:
Option Explicit

Dim strTargetFolder
Dim strPrinterName

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemEventSource
Dim objSWbemObjectEx


strTargetFolder = "C:\Обмен"
strPrinterName = "HP LaserJet 1200 Series PCL"

strComputer = "."

Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

Set objSWbemEventSource = objSWbemServicesEx.ExecNotificationQuery( _
"SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
"TargetInstance ISA 'CIM_DirectoryContainsFile' AND " & _
"TargetInstance.GroupComponent = 'Win32_Directory.Name=""" & Replace(strTargetFolder, "\", "\\\\") & """'" _
)


WScript.Echo "Monitor files creation and Print documents in [" & strTargetFolder & "]..."

Do
With objSWbemServicesEx.Get(objSWbemEventSource.NextEvent.TargetInstance.PartComponent)
WScript.Echo Now() & " | > | New file: [" & .Name & "]"

Select Case UCase(.Extension)
Case "TXT"
PrintByNotepad .Name, strPrinterName
Case Else
' Nothing to do
End Select

WScript.Echo Now() & " | v | Delete file: [" & .Name & "]"
.Delete
End With
Loop

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub PrintByNotepad(strFileName, strPrinterName)
WScript.CreateObject("WScript.Shell").Run """%SystemRoot%\System32\notepad.exe"" /pt """ & strFileName & """ """ & strPrinterName & """", 0, True

WScript.Echo Now() & " | # | Print file: [" & strFileName & "]"
End Sub
'=============================================================================

Детали в виде «несколько каталогов и несколько принтеров» подлежат разъяснению на предмет их связи.

alexansh
26-11-2013, 14:56
Iska, спасибо. Попробую.

Elven
26-11-2013, 15:20
Iska, а по мне так все понятно: два варианта вижу ясно
вариант номер раз.
дано
есть папки DIR1.1 DIR1.2, DIR2.1, DIR2.2, DIR2.3, DIR3 ... DIR100500.100500
есть принтеры PRINT1, PRINT2, PRINT3 ... PRINT100500
нужно
если файл упал в папки DIR1.1, DIR1.2 значит распечатать его на PRINT1, если в DIR2.1, DIR2.2, DIR 2.3 - на принтере PRINT2 и т.д. после распечатки файл удалить, в случае падения нескольких файлов распечатать их один за другим и точно так же удалить.
Вариант номер два
дано
есть папки DIR1, DIR2, DIR3 ... DIR100500
есть принтера PRINT1, PRINT2, PRINT3
нужно
если файл упал в вышеуказанные папки, его нужно распечатать на всех принтерах после распечатки файл удалить, в случае падения нескольких файлов распечатать их один за другим и точно так же удалить.

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

alexansh, какой из вариантов правильный?
мне, откровенно говоря, больше нравится первый, но вероятнее второй.
з.ы. если правильно сформулировать вопрос, то 90% ответа в нем уже будет.

Iska
26-11-2013, 15:32
если файл упал в папки DIR1.1, DIR1.2 значит распечатать его на PRINT1, если в DIR2.1, DIR2.2, DIR 2.3 - на принтере PRINT2 »
Elven, а почему не наоборот :lol:?

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

Elven
26-11-2013, 15:55
а почему не наоборот »
Iska, наоборот это как? если упал PRINT1 то все что было в папках DIR1.1, DIR1.2 печатать на PRINT2? Или какое наоборот имелось ввиду?
Не нужно. В скрипте опрос идёт каждые пять секунд. »
не заметил... сейчас буду перечитывать

alexansh
26-11-2013, 19:47
Elven, мой вариант как раз похож на ваш 1-ый вариант - с одноименного каталога файлы печатаются на одноименный принтер.
Дело в том, что необходимое дублирование каких-либо нужных нам файлов происходит на этапе "вбрасывания" их в каталоги. Т.е., на этом этапе и происходит сортировка всех нужных нам сообщений. Например, если есть необходимость печати одного и того же файла на 2-х или 3-х принтерах, то этот файл и "вбрасывают" сразу и в 1-ый каталог, и, например, во 3-ой каталог, и в 5-ый, к примеру. А уже сами каталоги, в свою очередь жестко привязываются только к одноименным принтерам. Вот такая задача.

Там, правда, есть ещё и другая задачка, цель которой состоит в разборе каждого файла и делении его на несколько более простых файлов из-за того, что в более крупном исходном файле содержится много однотипных сообщений, имеющих один и тот же формат, но отличающихся, естественно, по объему и содержанию. И эти однотипные сообщения нужно "вытаскивать" из больших файлов и затем их и распечатывать. Вот так.




© OSzone.net 2001-2012