フォルダ内へGIFデータが保存されたら、勝手に印刷することは実現できますでしょうか?

100ぐらいのファイルが適宜保存されますが、
保存と同時にプリント出力を行いたいです。

よくプリンターについているホットフォルダのようなイメージです。
どうぞよろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/03/26 12:36:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:cx20 No.1

回答回数607ベストアンサー獲得回数108

ポイント1500pt

フォルダ監視&印刷を行う VBScript を書いてみました。

印刷処理は、mspaint.exe(MSペイント)を「/p」オプションを付け実行することで実現しています。(印刷の出力先は、「通常使うプリンタ」に出力されます。)

以下の「監視対象フォルダ」「移動先フォルダ」を環境に合わせて変更の上、コマンドラインにて「CScript FileWatch.vbs」を実行お願いします。

処理を終了させる場合は [Ctrl]+[C] を押してください。

なお、印刷後、処理済みファイルを「移動先フォルダ」に移動(「上書き」コピーならびに削除)していますが、特段、エラー処理を行っていない為、場合によっては、ファイルが消える可能性がありますので、十分テストの上、実行お願いします。

' File : FileWatch.vbs
' Usage : CScript FileWatch.vbs
Option Explicit

Const g_strWatchFolder = "C:\home\edu\hatena\ohtsu6\1364222104\watch"   ' 監視対象フォルダ
Const g_strBackupFolder = "C:\home\edu\hatena\ohtsu6\1364222104\backup" ' 移動先フォルダ

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

Call Main()

Sub Main()
    Dim strFolder
    Dim strWatchFileName
    Dim strComputer
    Dim objWMIService
    Dim colMonitoredEvents
    Dim objLatestEvent
    
    strFolder = Replace( g_strWatchFolder, "\", "\\\\" )
    strComputer = "." 
    Set objWMIService = GetObject("winmgmts:" _ 
        & "{impersonationLevel=impersonate}!\\" & _ 
            strComputer & "\root\cimv2") 
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ 
        ("SELECT * FROM __InstanceCreationEvent WITHIN 3 WHERE " _ 
            & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _ 
                & "TargetInstance.GroupComponent= " _ 
                    & "'Win32_Directory.Name=""" & strFolder & """'") 
    Do 
        Set objLatestEvent = colMonitoredEvents.NextEvent 
        strWatchFileName =  objLatestEvent.TargetInstance.PartComponent 
        strWatchFileName = GetValue( strWatchFileName )
        strWatchFileName = Replace( strWatchFileName, "\\", "\" )
        PrintFile strWatchFileName
        MoveFile strWatchFileName, g_strBackupFolder
    Loop 
End Sub

Function GetValue( strKeyValue )
    Dim strResult
    Dim strArray
    strArray = Split(strKeyValue, "=") 
    strResult = strArray(1)
    GetValue = strResult
End Function 

Sub PrintFile( strFileName )
    Dim strCommand
    strCommand = "mspaint.exe " & strFileName & " /p"
    
    Dim objShell
    Set objShell = CreateObject("Wscript.Shell") 
    WScript.Echo "[" & strCommand & "] を実行しています。"
    objShell.Run strCommand, 1, True
End Sub

Sub MoveFile( strFileName, strBackupFolder )
    ' 二重引用符除去
    strFileName = Replace( strFileName, Chr(34), "" )
    
    ' フォルダの最後に「¥」を追加
    If Right(strBackupFolder, 1 ) <> "\" Then
        strBackupFolder = strBackupFolder + "\"
    End If
    
    WScript.Echo "[" & strFileName & "] を [" & strBackupFolder & "] に移動しています。"
    fso.CopyFile strFileName, strBackupFolder , True ' 上書きコピー
    fso.DeleteFile strFileName
End Sub

実行結果

C:\home\edu\hatena\ohtsu6\1364222104> CScript FileWatch.vbs
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

[mspaint.exe "C:\home\edu\hatena\ohtsu6\1364222104\watch\test.gif" /p] を実行しています。
[C:\home\edu\hatena\ohtsu6\1364222104\watch\test.gif] を [C:\home\edu\hatena\ohtsu6\1364222104\backup\] に移動しています。

参考情報

■ Hey, Scripting Guy! : フォルダにファイルが追加されたときに自動的にスクリプトを実行することはできますか
http://gallery.technet.microsoft.com/scriptcenter/fbc46ecd-04b3-40e1-85b6-905b3545fc74
■ Hey, Scripting Guy! フォルダに追加された新しいファイルを自動的に開く方法はありますか
http://gallery.technet.microsoft.com/scriptcenter/9726505e-b186-4f23-b7c3-a5d61c1efff1

id:ohtsu6

cx20さま
ご回答ありがとうございます。
無事にできました。
ちなみに、「windows フォトビューアー」で開いて
印刷をするこもできますでしょうか?

よろしくお願いいたします。

2013/03/26 12:35:39
id:cx20

ちなみに、「windows フォトビューアー」で開いて
印刷をするこもできますでしょうか?

一応、可能なようです。

プログラムの変更箇所は以下になります。

  • PrintFile() … [変更] strCommand のパラメータを変更
  • GetDefaultPrinter() … [追加] 通常使うプリンタ名を取得する。

以下、対応版です。

' File : FileWatch.vbs
' Usage : CScript FileWatch.vbs
Option Explicit

Const g_strWatchFolder = "C:\home\edu\hatena\ohtsu6\1364222104\watch"   ' 監視対象フォルダ
Const g_strBackupFolder = "C:\home\edu\hatena\ohtsu6\1364222104\backup" ' 移動先フォルダ

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

Call Main()

Sub Main()
    Dim strFolder
    Dim strWatchFileName
    Dim strComputer
    Dim objWMIService
    Dim colMonitoredEvents
    Dim objLatestEvent
    
    strFolder = Replace( g_strWatchFolder, "\", "\\\\" )
    strComputer = "." 
    Set objWMIService = GetObject("winmgmts:" _ 
        & "{impersonationLevel=impersonate}!\\" & _ 
            strComputer & "\root\cimv2") 
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ 
        ("SELECT * FROM __InstanceCreationEvent WITHIN 3 WHERE " _ 
            & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _ 
                & "TargetInstance.GroupComponent= " _ 
                    & "'Win32_Directory.Name=""" & strFolder & """'") 
    Do 
        Set objLatestEvent = colMonitoredEvents.NextEvent 
        strWatchFileName =  objLatestEvent.TargetInstance.PartComponent 
        strWatchFileName = GetValue( strWatchFileName )
        strWatchFileName = Replace( strWatchFileName, "\\", "\" )
        PrintFile strWatchFileName
        MoveFile strWatchFileName, g_strBackupFolder
    Loop 
End Sub

Function GetValue( strKeyValue )
    Dim strResult
    Dim strArray
    strArray = Split(strKeyValue, "=") 
    strResult = strArray(1)
    GetValue = strResult
End Function 

Sub PrintFile( strFileName )
    Dim strCommand
    Dim strPrinter
    strPrinter = GetDefaultPrinter()
    
    ' 「MSペイント」にて印刷する場合
    'strCommand = "mspaint.exe " & strFileName & " /p"
    
    ' 「Windows フォトビューア」で印刷する場合
    strCommand = "rundll32.exe shimgvw.dll,ImageView_PrintTo /pt " & strFileName & " """ & strPrinter & """"
    
    Dim objShell
    Set objShell = CreateObject("Wscript.Shell") 
    WScript.Echo "[" & strCommand & "] を実行しています。"
    objShell.Run strCommand, 1, True
End Sub

Sub MoveFile( strFileName, strBackupFolder )
    ' 二重引用符除去
    strFileName = Replace( strFileName, Chr(34), "" )
    
    ' フォルダの最後に「¥」を追加
    If Right(strBackupFolder, 1 ) <> "\" Then
        strBackupFolder = strBackupFolder + "\"
    End If
    
    WScript.Echo "[" & strFileName & "] を [" & strBackupFolder & "] に移動しています。"
    fso.CopyFile strFileName, strBackupFolder , True ' 上書きコピー
    fso.DeleteFile strFileName
End Sub

Function GetDefaultPrinter()
    Dim strResult
    Dim strComputer
    strComputer = "." 
    
    Dim objWMIService
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
    Dim colPrinters
    Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer Where Default = TRUE") 

    Dim objPrinter 
    For Each objPrinter in colPrinters 
        strResult = objPrinter.ShareName 
        Exit For
    Next
    GetDefaultPrinter = strResult 
End Function

参考情報

■ shimgvw.vbs - コマンドラインから「Windows画像とFaxビューア」で表示/印刷する
http://www.vector.co.jp/soft/winnt/util/se393313.html
■ Hey, Scripting Guy! コンピュータが通常使うプリンタを調べる方法はありますか。
http://gallery.technet.microsoft.com/scriptcenter/79f41de2-6873-4a3d-82e7-8e411c3b2906

2013/03/26 22:53:16

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません