1 (изменено: alexii, 2009-04-23 12:11:11)

Тема: VBS: Скрипт автоматической печати "всяких" документов из папки

Добрый день!
Прошу сразу не пинать, на основании данных с форума "склеил" скрипт по автоматической обработке файлов из заранее определенной папки. Код приведен ниже. Все печатает, все чистит, но возникают ошибки вовремя выполнения:
1. Когда в папке появляются несколько файлов одного типа, печать происходит 2 раза.
2. По ходу выполнения скрипта, если в папке появляется только 1 тип файлов, вылетаем ошибка при попытке удалить файлы.

собственно код:

strDir = "c:\TecT" ' каталог, за которым следим
strComputer = "." ' имя компьютера; "." означает текущий компьютер
'==============================================================================
strDirSlash = Replace(strDir, "\", "\\\\")
strNamespace = "Root\CIMV2"
' Подключаемся к пространству имен
Set objService = GetObject("WinMgmts:\\" & strComputer & "\" & strNamespace)
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")

objService.ExecNotificationQueryAsync objSink, _
    "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " &_
    "Targetinstance ISA 'CIM_DirectoryContainsFile' and " &_
    "TargetInstance.GroupComponent= " &_
    "'Win32_Directory.Name=""" & strDirSlash & """'"

' Выводим сообщение о запуске сканера
Wscript.Echo "Запущен сканер создания файла в папке " & strDir

' Запускаем бесконечный цикл ожидания
While 1
    WScript.Sleep 1000
Wend

' Процедура-обработчик события OnObjectReady объекта sWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
    strResult = Date & " " & Time & vbCrLf &_
        "Создан файл: " &  oOutParams.TargetInstance.PartComponent
'    Wscript.Echo strResult

' Печать всех файлов .doc из папки
    'Option Explicit

    Const wdDoNotSaveChanges    =  0
    Const wdPromptToSaveChanges = -2
    Const wdSaveChanges         = -1

    Dim objWord, objExcel, objDoc, objWorkbook, objFS, objFolder, objItem, objFSO

    Set objFS = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFS.GetFolder(strDirSlash) 'Папка, из которой производится печать
    Set objWord = WScript.CreateObject("Word.Application")

     For Each objItem In objFolder.Files
        If StrComp(objFS.GetExtensionName(objItem.Name), "doc", vbTextCompare) = 0 Then
            With objWord
                Set objDoc = .Documents.Open(objItem.Path, False, True, False)
                objDoc.PrintOut False
                Set objDoc = Nothing
            End With

        End If
      Next
     objWord.Quit
     Set objWord = Nothing

     ' Удаление файлов
     Set FSO = CreateObject("Scripting.FileSystemObject")
     FSO.DeleteFile "C:\TecT\*.doc", 0




' Печать всех файлов .xls из папки
    'Option Explicit

    Set objExcel = WScript.CreateObject("Excel.Application")

    'With objExcel
    ' .Workbooks.Open(FileName, UpdateLinks, ReadOnly,...)
    '
    '  UpdateLinks is:
    ' 0 Doesn't update any references
    ' 1 Updates external references but not remote references
    ' 2 Updates remote references but not external references
    ' 3 Updates both remote and external references
    '
    ' or .AskToUpdateLinks = False
    ' Теоретически возможно появление и других непредусмотренных диалогов
    ' Возможно, в этом случае стоит поиграться со свойством Application.DisplayAlerts

    'Set objWorkbook = .Workbooks.Open("C:\Temp\01.xls", 0, True)

    'objWorkbook.PrintOut
    'objWorkbook.Saved = True
     For Each objItem In objFolder.Files
        If StrComp(objFS.GetExtensionName(objItem.Name), "xls", vbTextCompare) = 0 Then
            With objExcel
                Set objWorkbook = .Workbooks.Open(objItem.Path, 0, True)
                objWorkbook.PrintOut
                objWorkbook.Saved = True
                Set objWorkbook = Nothing
            End With

        End If
     Next
    objExcel.Quit
    Set objWorkbook = Nothing

     'Удаление файлов
     Set FSO = CreateObject("Scripting.FileSystemObject")
     FSO.DeleteFile "C:\TecT\*.xls", 0

End Sub

Как все это можно поправить?

2

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

abc, почему выбран именно асинхронный режим подписки на событие?

3 (изменено: abc, 2009-04-23 12:15:56)

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Файлы, по задумке, поподают в папку в произвольный период времени (т.е. на общий ресурс по сети может заливаться сразу несколько файлов из разных источников), пример приведен только с doc и xls, а так туда будут попадать pdf, eml, odt.
Сейчас буду искать др. возможные пути решения, но хотелось бы реализовать с помощью скрипта...
ЗЫ: быстро получилось сделать ч/з командную строку но не устраивает работа (плюс использование планировщика).

Буду рад оптимизации/исправлению кода!

4

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

2abc: если Вы уж делаете подписку, то проверяйте только тип файла, вызвавшего событие, и работайте только с ним, никаких «For Each objItem In objFolder.Files».

Коллега Dmitrii совершенно правильно заметил, что в Вашем случае нужно использовать синхронную подписку на события; тем самым не будет

Когда в папке появляются несколько файлов одного типа, печать происходит 2 раза.

Это не печать происходит два раза, а асинхронные события и «For Each objItem In objFolder.Files» приводят к данному результату.

По ходу выполнения скрипта, если в папке появляется только 1 тип файлов, вылетаем ошибка при попытке удалить файлы.

Повторюсь ещё раз: работайте только с файлом, вызвавшим событие.

5

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Уважаемый alexii, я только начинаю во всем этом разбираться, если Вас не сильно затруднит, то не могли бы Вы подправить тот код, который я выставил?
Заранее спасибо.

6

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Могу попробовать, но только ночью; не раньше.

7

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Огромное спасибо!

8

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

OFF:

abc пишет:

Огромное спасибо!

Рано , коллега.

9

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

abc, пробуйте:

Option Explicit

Dim strTargetFolder
Dim strComputer

Dim objSWbemServicesEx
Dim objSWbemEventSource
Dim objSWbemObjectEx_Event
Dim objSWbemObjectEx_CIM_DataFile


strTargetFolder = "c:\TecT"
strComputer     = "."

Set objSWbemServicesEx = GetObject("WinMgmts:\\" & 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
    Set objSWbemObjectEx_Event = objSWbemEventSource.NextEvent
    Set objSWbemObjectEx_CIM_DataFile = objSWbemServicesEx.Get(objSWbemObjectEx_Event.TargetInstance.PartComponent)
    
    WScript.Echo Now() & " |  | New file:    [" & objSWbemObjectEx_CIM_DataFile.Name & "]"
    
    Select Case UCase(objSWbemObjectEx_CIM_DataFile.Extension)
        Case "DOC"
            PrintByWord  objSWbemObjectEx_CIM_DataFile.Name
        Case "XLS"
            PrintByExcel objSWbemObjectEx_CIM_DataFile.Name
        Case Else
            ' Nothing to do
    End Select
    
    
    WScript.Echo Now() & " |  | Delete file: [" & objSWbemObjectEx_CIM_DataFile.Name & "]"
    objSWbemObjectEx_CIM_DataFile.Delete
Loop

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

'=============================================================================
Sub PrintByWord(strFileName)
    Const wdDoNotSaveChanges = 0
    
    Dim objWord
    Dim objDoc
    
    Set objWord = WScript.CreateObject("Word.Application")
    
    WScript.Echo Now() & " |  | Print file:  [" & strFileName & "]"
    
    With objWord
        Set objDoc = .Documents.Open(strFileName, False, True, False)
        
        objDoc.PrintOut True
        
        Do
            WScript.Sleep 500
        Loop Until .BackgroundPrintingStatus = 0
        
        Set objDoc = Nothing
        
        .Quit wdDoNotSaveChanges
    End With
    
    Set objWord = Nothing
End Sub
'=============================================================================

'=============================================================================
Sub PrintByExcel(strFileName)
    Dim objExcel
    Dim objWorkbook
    
    Set objExcel = WScript.CreateObject("Excel.Application")
    
    WScript.Echo Now() & " |  | Print file:  [" & strFileName & "]"
    
    With objExcel
        Set objWorkbook = .Workbooks.Open(strFileName, 0, True)
        
        objWorkbook.PrintOut
        objWorkbook.Saved = True
        
        Set objWorkbook = Nothing
        
        .Quit
    End With
    
    Set objExcel = Nothing
End Sub
'=============================================================================

10 (изменено: alexii, 2009-04-24 09:18:01)

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Спасибо, сейчас попробую...
У меня вчера в конечном итоге получилось следующее:

strDir = "c:\TecT" ' каталог, за которым следим
strComputer = "." ' имя компьютера; "." означает текущий компьютер
'==============================================================================
strDirSlash = Replace(strDir, "\", "\\\\")
strNamespace = "Root\CIMV2"
' Подключаемся к пространству имен
Set objService = GetObject("WinMgmts:\\" & strComputer & "\" & strNamespace)
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")

objService.ExecNotificationQueryAsync objSink, _
    "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " &_
    "Targetinstance ISA 'CIM_DirectoryContainsFile' and " &_
    "TargetInstance.GroupComponent= " &_
    "'Win32_Directory.Name=""" & strDirSlash & """'"

' Выводим сообщение о запуске сканера
Wscript.Echo "Запущен сканер создания файла в папке " & strDir

' Запускаем бесконечный цикл ожидания
While 1
    WScript.Sleep 1000
Wend

' Процедура-обработчик события OnObjectReady объекта sWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
    strResult = Date & " " & Time & vbCrLf &_
        "Создан файл: " &  oOutParams.TargetInstance.PartComponent
'    Wscript.Echo strResult


'Проверка расширения файла'
    Dim objWord, objExcel, objDoc, objWorkbook, objFS, objFolder, objItem, objFSO, WshShell, oExec
    
    Const wdDoNotSaveChanges    =  0
    Const wdPromptToSaveChanges = -2
    Const wdSaveChanges         = -1

    Set objFS = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFS.GetFolder(strDirSlash) 'Папка, из которой производится печать

For Each objItem In objFolder.Files
strExt = objFS.GetExtensionName(objItem.Name)

if(strExt = "doc") then

    Set objWord = WScript.CreateObject("Word.Application")
       With objWord
        Set objDoc = .Documents.Open(objItem.Path, False, True, False)
        objDoc.PrintOut False
        Set objDoc = Nothing
       End With

     objWord.Quit
     Set objWord = Nothing

' Удаление файлов
     Set FSO = CreateObject("Scripting.FileSystemObject")
     FSO.DeleteFile objItem.Path, 0
End if

if(strExt = "xls") then
' Печать всех файлов .xls из папки
    'Option Explicit

    Set objExcel = WScript.CreateObject("Excel.Application")
           With objExcel
            Set objWorkbook = .Workbooks.Open(objItem.Path, 0, True)
            objWorkbook.PrintOut
            objWorkbook.Saved = True
            Set objWorkbook = Nothing
           End With

    objExcel.Quit
    Set objWorkbook = Nothing

'Удаление файлов
     Set FSO = CreateObject("Scripting.FileSystemObject")
     FSO.DeleteFile objItem.Path, 0
     
End If

Next

End Sub

Тоже заработало

11

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Угу. Только не надо 2*n раз создавать «Set FSO = CreateObject("Scripting.FileSystemObject")», достаточно одного раза в начале скрипта.

А код скрипта на форуме оформляется тегом CODE.

12

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Хотя нет, я поторопился. В Вашем варианте Вы опять рано или поздно наткнётесь на те же грабли с двойной печатью и удалением. Зачем Вы делаете:

For Each objItem In objFolder.Files

Вам нужно работать только с файлом, вызвавшем событие. Посмотрите, как сие делается в моём варианте:

Set objSWbemObjectEx_CIM_DataFile = objSWbemServicesEx.Get(objSWbemObjectEx_Event.TargetInstance.PartComponent)

И потом работаем только с этим файлом, вызвавшем событие. Его же потом и удаляем. А у Вас (поскольку используется асинхронная обработка и перебор всех файлов в папке) будут коллизии. Скопируйте, например, два больших файла (ну, или со сложной графикой, чтобы формирование задания на печать шло подольше) *.doc в папку назначения, а затем ещё парочку — Вы опять получите двойную печать.

13

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Очень полезный и многоцелевой скрипт.

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

Буду благодарен за советы.

14

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Увы. Сейчас с ходу не нашёл ссылки, но было дело: пробовали мы тут и вариант с использованием предиката LIKE для Win32_Directory.Name (работает, но безумно медленно; на диске с большой и разветвлённой структурой каталогов обработка может начаться спустя часы; по-моему, были и банальные пропуски событий), пробовали и вариант с параллельным асинхронным отслеживанием создания/удаления каталогов и, затем, добавления/останова асинхронных запросов отслеживания на этот созданный/удалённый каталог (буквально десяток-другой новых запросов — и дикая загрузка процессора и диска). Так что, по сути, я пришёл к выводу, что WMI слабо годится для слежения за структурой каталогов (да ещё и с отслеживанием создания/удаления подкаталогов).

15

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Уважаемый Alexii. Пользуюсь Вашим скриптом, очень помогает. Хочу попросить Вас, если это не трудно, расширить его возможности на файлы *.PDF или хотя бы намекнуть как это сделать с помощью "Adobe Reader" или "PDF-Xchabge Viewer"

16

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Проблема в том, что Адоб не может нормально закрыть после себя окно программы, т.е. после распечатки документа адоб весит в процессах и окно в панели задач....
решение, которым можно пользовать - pdfp.exe
Уже давно пользую данный скрипт для автоматической обработки почты и вообще любых файлов....

17 (изменено: Dima_O, 2010-02-27 18:52:23)

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Если я верно понял он всё равно требуует. что бы был установлен акробат ридер... А ты можеш кинуть сюда ВЕСЬ скрипт которым ты уже давно пользуешся для печати ВСЕХ файлов.

18 (изменено: abc, 2010-02-27 20:02:30)

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Ок. в скрипте пользую также программулину для раскодировки .eml писем.

On Error Resume Next
Dim strTargetFolder
Dim strComputer

Dim objSWbemServicesEx
Dim objSWbemEventSource
Dim objSWbemObjectEx_Event
Dim objSWbemObjectEx_CIM_DataFile


strTargetFolder = "c:\Файлы"
strComputer     = "."

Set objSWbemServicesEx = GetObject("WinMgmts:\\" & strComputer & "\Root\CIMV2")

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set LogStream = objFSO.OpenTextFile("D:\WORK\Скрипты\tXt.log", 8, True)

Set oAutoIt = WScript.CreateObject("AutoItX3.Control")

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


Log

Do
    Set objSWbemObjectEx_Event = objSWbemEventSource.NextEvent
    Set objSWbemObjectEx_CIM_DataFile = objSWbemServicesEx.Get(objSWbemObjectEx_Event.TargetInstance.PartComponent)
    
    LogNew(strFileName)
    NewFile(strFileName)

    
    Select Case UCase(objSWbemObjectEx_CIM_DataFile.Extension)
        Case "DOC"
            PrintByWord  objSWbemObjectEx_CIM_DataFile.Name
        Case "RTF"
            PrintByWord  objSWbemObjectEx_CIM_DataFile.Name
        Case "XLS"
            PrintByExcel objSWbemObjectEx_CIM_DataFile.Name
        Case "PDF"
             PrintByPDF objSWbemObjectEx_CIM_DataFile.Name
        Case "EML"
             PrintByEML objSWbemObjectEx_CIM_DataFile.Name
        Case "MSG"
             PrintByMSG objSWbemObjectEx_CIM_DataFile.Name
        Case "ZIP"
             PrintByARC objSWbemObjectEx_CIM_DataFile.Name
        Case "ARJ"
             PrintByARC objSWbemObjectEx_CIM_DataFile.Name
        Case "RAR"
             PrintByARC objSWbemObjectEx_CIM_DataFile.Name
        Case "DAT"
             PrintByDAT objSWbemObjectEx_CIM_DataFile.Name
        Case Else
            ' Nothing to do
    End Select
    
    WScript.Sleep 5000
    
    LogDel(strFileName)
    FileDel(strFileName)
    oAutoIt.ToolTip ""

    WScript.Sleep 5000

    objSWbemObjectEx_CIM_DataFile.Delete
Loop

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

'=============================================================================
Sub PrintByWord(strFileName)
    Const wdDoNotSaveChanges = 0
    
    Dim objWord
    Dim objDoc
    
    Set objWord = WScript.CreateObject("Word.Application")
    
    LogPrint(strFileName)
    Print(strFileName)
    
    With objWord
        Set objDoc = .Documents.Open(strFileName, False, True, False)
        
        objDoc.PrintOut True
        
        Do
            WScript.Sleep 500
        Loop Until .BackgroundPrintingStatus = 0
        
        Set objDoc = Nothing
        
        .Quit wdDoNotSaveChanges
    End With
    
    Set objWord = Nothing
End Sub
'=============================================================================

'=============================================================================
Sub PrintByExcel(strFileName)
    Dim objExcel
    Dim objWorkbook
    
    Set objExcel = WScript.CreateObject("Excel.Application")
    
    LogPrint(strFileName)
    Print(strFileName)
    
    With objExcel
        Set objWorkbook = .Workbooks.Open(strFileName, 0, True)
        
        objWorkbook.PrintOut
        objWorkbook.Saved = True
        
        Set objWorkbook = Nothing
        
        .Quit
    End With

    Set objExcel = Nothing
End Sub
'=============================================================================

'=============================================================================
Sub PrintByPDF(strFileName)
    
    Set WshShell = CreateObject("WScript.Shell")
    Run = WshShell.Run("pdfp.exe " & strFileName, 7, True)
    LogPrint(strFileName)
    Print(strFileName)
    
    Set WshShell = Nothing
End Sub
'=============================================================================

'=============================================================================
Sub PrintByEML(strFileName)
    
    Set WshShell = CreateObject("WScript.Shell")
    Run = WshShell.Run("D:\WORK\WoRK\doc\unmime.exe /m " & strFileName, 7, True)
    LogDecode(strFileName)
    Decode(strFileName)

    Set WshShell = Nothing
End Sub
'=============================================================================

'=============================================================================
Sub PrintByMSG(strFileName)
    
    Set WshShell = CreateObject("WScript.Shell")
    Run = WshShell.Run("D:\WORK\WoRK\doc\unmime.exe /m " & strFileName, 7, True)
    LogDecode(strFileName)
    Decode(strFileName)

    Set WshShell = Nothing
End Sub
'=============================================================================

Sub PrintByARC(strFileName)
    
    Set WshShell = CreateObject("WScript.Shell")
    Run = WshShell.Run("cmd.exe /c copy " & strFileName & " \\comp-01\C$\Archiv_fl\*.*", 7, True)
    LogCopy(strFileName)
    Copy(strFileName)

    Set WshShell = Nothing
End Sub
'=============================================================================

Sub PrintByDAT(strFileName)
    
    Set WshShell = CreateObject("WScript.Shell")
    Run = WshShell.Run("cmd.exe /c copy " & strFileName & " c:\Файлы\*.xls", 7, True)
    LogRename(strFileName)
    Rename(strFileName)

    Set WshShell = Nothing
End Sub
'=============================================================================

Sub NewFile(strFileName)
    
    oAutoIt.ToolTip Now() & " | | New file:    [" & objSWbemObjectEx_CIM_DataFile.Name & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub FileDel(strFileName)
    
    oAutoIt.ToolTip Now() & " |  | Delete file: [" & objSWbemObjectEx_CIM_DataFile.Name & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub Print(strFileName)
    
    oAutoIt.ToolTip Now() & " |  | Print file:  [" & strFileName & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub Decode(strFileName)
    
    oAutoIt.ToolTip Now() & " |  | Decode file:  [" & strFileName & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub Copy(strFileName)
    
    oAutoIt.ToolTip Now() & " |  | Copeing file:  [" & strFileName & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub Rename(strFileName)
    
    oAutoIt.ToolTip Now() & " |  | Renamed file:  [" & strFileName & " to " & strTargetFolder & "\*.xls" & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub Log()
    
    LogStream.WriteLine Now() & " Monitor files creation and Print documents in [" & strTargetFolder & "]..."
    
End Sub
'=============================================================================

Sub LogNew(strFileName)
    
    LogStream.WriteLine Now() & " | | New file:    [" & objSWbemObjectEx_CIM_DataFile.Name & "]"
    
End Sub
'=============================================================================

Sub LogDel(strFileName)
    
    LogStream.WriteLine Now() & " |  | Del file:    [" & objSWbemObjectEx_CIM_DataFile.Name & "]"
    
End Sub
'=============================================================================

Sub LogPrint(strFileName)
    
    LogStream.WriteLine Now() & " |  | Prn file:    [" & strFileName & "]"
    
End Sub
'=============================================================================

Sub LogDecode(strFileName)
    
    LogStream.WriteLine Now() & " |  | Dec file:    [" & strFileName & "]"
    
End Sub
'=============================================================================

Sub LogRename(strFileName)
    
    LogStream.WriteLine Now() & " |  | Ren file:    [" & strFileName & " to " & strTargetFolder & "\*.xls" & "]"
    
End Sub
'=============================================================================

Sub LogCopy(strFileName)
    
    LogStream.WriteLine Now() & " |  | Cop file:    [" & strFileName & "]"
    
End Sub
'=============================================================================

как то так.....
+ко всему, прикручивал к работе портайбл версию офиса.... пока лицензию не приобрел.... )

19

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Спасибо, помогло !.

20

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

На здоровье......
Единственный вопрос, который меня мучает до сих пор - как нормально декодировать письма?! Т.Е. при ПЕРЕСЫЛКЕ письма, сохранение проходит в формат .емл, а если приложение содержит вложенный файл с русскими буковками - корректное декодирование не проходит..... декодируется файл с расширением dat
в то же время механизм декодировки в тотал командере работает на ура..... нО! как его прикруить к скрипту?
может кто сталкивался с нормальными внешними обработчиками и что подскажет? либо как это проделать стандартными средствами винды?

21

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

скрипт хорош и работает, но допишите его для PDF файлов и объясните мне "чайнику" как его запустить в автоматическом режиме...
можно еще было бы дополнение на графические файлы, но с ними наверняка сложнее...

22

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

ReX03 пишет:

но допишите его для PDF файлов

Чем не устраивает решение, предложенное выше?

ReX03 пишет:

можно еще было бы дополнение на графические файлы, но с ними наверняка сложнее...

Вопрос опять же в конкретном приложении.

23

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

alexii пишет:
ReX03 пишет:

но допишите его для PDF файлов

Чем не устраивает решение, предложенное выше?

не работает ( или я "чайник" и не правильно что-то сделал.
предыдущий вариант на ворд и на эксель работает, а этот сразу вылетает.

24

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Покажите Ваш код.

25

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

А почему бы для печати не использовать verb "print"?

26

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

а) приложение «Adobe Reader» «мельтешит» на экране, б) остаётся запущенным после исполнения глагола «print», если ранее не было запущено других экземпляров приложения и в) исполнение глагола асинхронное — для любого отслеживания по процессам придётся играть в «угадайку» со временем.

27

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

Понял, согласен.

28

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

JSman, Вы знаете — а ведь на самом-то деле Ваша идея вполне гожа. Наш-то скрипт для чего? Для печати «всяческих» документов. Многократной печати. Так что — хрен с ним, с рублём. Будем сами запускать «пустой» Adobe Reader в скрытом режиме при отсутствии такового. И пусть себе этот один экземпляр «висит» в процессах. Оговорим этот момент в описании — и точка. Что ж делать, ежели иначе на WSH не выходит корректно. Что скажете?

29

Re: VBS: Скрипт автоматической печати "всяких" документов из папки

alexii пишет:

Покажите Ваш код.

On Error Resume Next
Dim strTargetFolder
Dim strComputer

Dim objSWbemServicesEx
Dim objSWbemEventSource
Dim objSWbemObjectEx_Event
Dim objSWbemObjectEx_CIM_DataFile


strTargetFolder = "D:\PrintForMe"
strComputer     = "."

Set objSWbemServicesEx = GetObject("WinMgmts:\\" & strComputer & "\Root\CIMV2")

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set LogStream = objFSO.OpenTextFile("D:\WORK\Скрипты\tXt.log", 8, True)

Set oAutoIt = WScript.CreateObject("AutoItX3.Control")

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


Log

Do
    Set objSWbemObjectEx_Event = objSWbemEventSource.NextEvent
    Set objSWbemObjectEx_CIM_DataFile = objSWbemServicesEx.Get(objSWbemObjectEx_Event.TargetInstance.PartComponent)
    
    LogNew(strFileName)
    NewFile(strFileName)

    
    Select Case UCase(objSWbemObjectEx_CIM_DataFile.Extension)
        Case "DOC"
            PrintByWord  objSWbemObjectEx_CIM_DataFile.Name
        Case "RTF"
            PrintByWord  objSWbemObjectEx_CIM_DataFile.Name
        Case "XLS"
            PrintByExcel objSWbemObjectEx_CIM_DataFile.Name
        Case "PDF"
             PrintByPDF objSWbemObjectEx_CIM_DataFile.Name
        Case Else
            ' Nothing to do
    End Select
    
    WScript.Sleep 5000
    
    LogDel(strFileName)
    FileDel(strFileName)
    oAutoIt.ToolTip ""

    WScript.Sleep 5000

    objSWbemObjectEx_CIM_DataFile.Delete
Loop

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

'=============================================================================
Sub PrintByWord(strFileName)
    Const wdDoNotSaveChanges = 0
    
    Dim objWord
    Dim objDoc
    
    Set objWord = WScript.CreateObject("Word.Application")
    
    LogPrint(strFileName)
    Print(strFileName)
    
    With objWord
        Set objDoc = .Documents.Open(strFileName, False, True, False)
        
        objDoc.PrintOut True
        
        Do
            WScript.Sleep 500
        Loop Until .BackgroundPrintingStatus = 0
        
        Set objDoc = Nothing
        
        .Quit wdDoNotSaveChanges
    End With
    
    Set objWord = Nothing
End Sub
'=============================================================================

'=============================================================================
Sub PrintByExcel(strFileName)
    Dim objExcel
    Dim objWorkbook
    
    Set objExcel = WScript.CreateObject("Excel.Application")
    
    LogPrint(strFileName)
    Print(strFileName)
    
    With objExcel
        Set objWorkbook = .Workbooks.Open(strFileName, 0, True)
        
        objWorkbook.PrintOut
        objWorkbook.Saved = True
        
        Set objWorkbook = Nothing
        
        .Quit
    End With

    Set objExcel = Nothing
End Sub
'=============================================================================

'=============================================================================
Sub PrintByPDF(strFileName)
    
    Set WshShell = CreateObject("WScript.Shell")
    Run = WshShell.Run("pdfp.exe " & strFileName, 7, True)
    LogPrint(strFileName)
    Print(strFileName)
    
    Set WshShell = Nothing
End Sub
'=============================================================================

Sub NewFile(strFileName)
    
    oAutoIt.ToolTip Now() & " | | New file:    [" & objSWbemObjectEx_CIM_DataFile.Name & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub FileDel(strFileName)
    
    oAutoIt.ToolTip Now() & " |  | Delete file: [" & objSWbemObjectEx_CIM_DataFile.Name & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub Print(strFileName)
    
    oAutoIt.ToolTip Now() & " |  | Print file:  [" & strFileName & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub Decode(strFileName)
    
    oAutoIt.ToolTip Now() & " |  | Decode file:  [" & strFileName & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub Copy(strFileName)
    
    oAutoIt.ToolTip Now() & " |  | Copeing file:  [" & strFileName & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub Rename(strFileName)
    
    oAutoIt.ToolTip Now() & " |  | Renamed file:  [" & strFileName & " to " & strTargetFolder & "\*.xls" & "]", 0, 955
    oAutoIt.Sleep 1000     ' Sleep to give tooltip time to display
    
End Sub
'=============================================================================

Sub Log()
    
    LogStream.WriteLine Now() & " Monitor files creation and Print documents in [" & strTargetFolder & "]..."
    
End Sub
'=============================================================================

Sub LogNew(strFileName)
    
    LogStream.WriteLine Now() & " | | New file:    [" & objSWbemObjectEx_CIM_DataFile.Name & "]"
    
End Sub
'=============================================================================

Sub LogDel(strFileName)
    
    LogStream.WriteLine Now() & " |  | Del file:    [" & objSWbemObjectEx_CIM_DataFile.Name & "]"
    
End Sub
'=============================================================================

Sub LogPrint(strFileName)
    
    LogStream.WriteLine Now() & " |  | Prn file:    [" & strFileName & "]"
    
End Sub
'=============================================================================

Sub LogDecode(strFileName)
    
    LogStream.WriteLine Now() & " |  | Dec file:    [" & strFileName & "]"
    
End Sub
'=============================================================================

Sub LogRename(strFileName)
    
    LogStream.WriteLine Now() & " |  | Ren file:    [" & strFileName & " to " & strTargetFolder & "\*.xls" & "]"
    
End Sub
'=============================================================================

Sub LogCopy(strFileName)
    
    LogStream.WriteLine Now() & " |  | Cop file:    [" & strFileName & "]"
    
End Sub
'=============================================================================