プログラミング

プログラミングに関するフォーラムです。VBAは除きます。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : その他)
thumbs.dbを削除したい
投稿日時: 21/01/20 11:17:35
投稿者: ラングドシャ

お願いします。
vbsをbatファイルで呼び出し、フォルダ内すべてのファイルを添付してメール送信しています。
ある時から添付ファイルにthumbs.dbも添付されるようになりました。
batファイルでメール送信前にthumbs.dbを削除したのですが、添付されてしまいます。
vbs、batファイルで拡張子をしてしてみるとエラーになりました。
どのようにすればthumbs.dbが添付されなくなるでしょうか?
 
vbsは以下の通りです :test.vbs

Dim Fs, strPath, Fl, F, NewFile, NewFileFP, OutF
Dim strBody

Dim wkYear
Dim wkMonth
Dim wkDay

Dim objFileSys
Dim objFolder
Dim objFile

Dim WshShell, BtnCode
 Set WshShell = WScript.CreateObject("WScript.Shell")
 Set objShell = CreateObject("Wscript.Shell")
 Set oMsg = CreateObject("CDO.Message")


'年月日を取得します
wkYear=Year(Now())
wkMonth = Month(Now())
wkDay = Day(Now())

'1-9月の場合、0を付与します。
If wkMonth < 10 Then
  wkMonth= "0" & wkMonth
End If

'1-9日の場合、0を付与します。
If wkDay < 10 Then
  wkDay= "0" & wkDay
Else
end if

'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
 
'フォルダのオブジェクトを取得
Set objFolder = objFileSys.GetFolder("Y:\test")

Set Fs = CreateObject("Scripting.FileSystemObject")
strPath = "Y:\test"

strBody = "課長" & vbCrLf & vbCrLf & "テストを送付します。" & vbCrLf & vbCrLf & vbCrLf & "<ファイル名>" & vbCrLf
'FolderオブジェクトのFilesプロパティからFileオブジェクトを取得 
For Each objFile In objFolder.Files 
     strBody = strBody & objFile.Name & vbCrLf 
 Next 

 oMsg.From = "管理部 <kanribu@*****.com>" '送信元
 oMsg.To = "課長 <katyou@*****.com>" '送信先
 oMsg.Cc = "担当1 様 <tantou@****.com>"
 oMsg.Bcc = "その他 様 <sonota@*****.com>"
 oMsg.Subject = "テスト送信の件" '件名
 oMsg.TextBody = strBody


If Fs.FolderExists(strPath) Then 
     Set Fl = Fs.GetFolder(strPath) 
     For Each F In Fl.Files 
         oMsg.AddAttachment F.Path 
     Next 
     Set Fl = Nothing 
 Else 
     MsgBox "フォルダー """ & strPath & """ を参照出来ません。", vbCritical, "エラー" 
End If 

Set objFolder = Nothing
Set objFileSys = Nothing 

 oMsg.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
 oMsg.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "*******"
 oMsg.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
 oMsg.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
 oMsg.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/sendusername") = "info@*****.com"
 oMsg.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "*********"
 oMsg.Configuration.Fields.Update
 oMsg.Send
 
Set OutF = Fs.OpenTextFile("C:\FileSend\Fsend.log",8)
 OutF.WriteLine "Date[" & date & "] Time[" & time & "] File[" & NewFile & "]"
 OutF.Close
 
 objShell.Popup "メール送信しました。", 0, "送信完了", 0
 Set Fs = Nothing
 Set Fl = Nothing
 Set OutF = Nothing

 
batファイル
net use y: "\\172.16.1.1\管理部" /y
@echo off

 for %%F in (Y:\test\*.*) do goto FILE_EXIST
 echo ファイルが無い
goto End

:FILE_EXIST
cscript C:\test.vbs //nologo

del /q Y:\test\*.*
:End

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

回答
投稿日時: 21/01/20 15:07:35
投稿者: Suzu

まず、thumbs.db ですが、サムネイルファイルです。
プレビューウィンドや、写真のサムネイル機能を使用すると フォルダ内に自動的に作成されます。
 
また、そのファイル自体は、隠し属性 ファイルであり
BATファイル内の
 
for %%F in (Y:\test\*.*) do goto FILE_EXIST
del /q Y:\test\*.*
 
の *.* では 処理対象に入りません。
 

引用:
batファイルでメール送信前にthumbs.dbを削除した

この命令は提示頂けていないので、同様の処理を行ってるのであれば
削除されていないのではないかと思います。
 
 
対して VBS内の FileSystemObject を使用した
 
For Each objFile In objFolder.Files
   strBody = strBody & objFile.Name & vbCrLf
Next
 
の場合、隠しファイル も処理対象になります。
 
ですので、添付される事になります。
 
 
・BAT内で、DELコマンドに /A H スイッチをつけ隠し属性ファイルをも削除する
・VBS内で ファイル名にて処理対象から外す
・VBS内で ファイル属性により処理対象から外す
 
 
 
引用:
ある時から添付ファイルにthumbs.dbも添付されるようになりました。
batファイルでメール送信前にthumbs.dbを削除したのですが、添付されてしまいます。
vbs、batファイルで拡張子をしてしてみるとエラーになりました。

 
拡張子をしてみる とは どのような行為でしょうか。

投稿日時: 21/01/20 17:53:38
投稿者: ラングドシャ

Suzu様
 
ご回答ありがとうございます。
 
Batファイルでの削除に関してはVbsを呼び出す前に
 

DEL Thumbs.db /S

 
のコマンドで行っていました。
 
これを 
DEL Thumbs.db /A:H
に変更してみます。
 
vbsの知識がなく
引用:
・VBS内で ファイル名にて処理対象から外す
・VBS内で ファイル属性により処理対象から外す

はなかなか難しいので、まずはBATファイルからチャレンジします。
※現在のvbsはネットで調べたりこちらでわからないところを質問して作成しました。
 
引用:
拡張子をしてみる とは どのような行為でしょうか。

に関してですが入力ミスでした。
拡張子を指定してみる。ということで、添付したいのはフォルダ内のエクセルファイルなので
batファイルの「Y:\test\*.**」のところを「Y:\test\*.xlsx」とするとエラーに
なってしまいました。
 
ありがとうございます。

回答
投稿日時: 21/01/21 13:25:24
投稿者: Suzu

サンプルです。
 
・オブジェクトが重複していたりするので、統一しました。
・対象フォルダの「隠しファイル」属性を判定し、隠しファイル属性 以外 のファイルを処理対象
・対象ファイル名 を全て ログファイルに出力
 
・バッチファイルにて、ファイルの存在確認を行っているが、スクリプト内でも実施重複
    ⇒スクリプトにて実施するとして、
    ・バッチ内のネットワークドライブ接続処理
     スクリプト内にShellオブジェクトの変数があったので、
     Shellオブジェクトを使い ネットワークドライブと接続
    ・ファイル削除処理もスクリプト内にて処理
 
Const Hidden = 2
 
Dim strPath, strBody
Dim NewFile
 
Dim objShell, objFileSys, objFolder, objFile, objOutF
Dim oMsg
 
'ネットワークドライブ設定
Set objShell = CreateObject("WScript.Shell")
objShell.Run "NET USE Y: ""\\172.16.1.1\管理部"" / Y"
Set objShell = Nothing
 
strPath = "Y:\test"
 
'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
 
If objFileSys.FolderExists(strPath) Then
    'フォルダのオブジェクトを取得
    Set objFolder = objFileSys.GetFolder(strPath)
    Set oMsg = CreateObject("CDO.Message")
 
    strBody = "課長" & vbCrLf & vbCrLf & "テストを送付します。" & vbCrLf & vbCrLf & vbCrLf & "<ファイル名>" & vbCrLf
 
    'FolderオブジェクトのFilesプロパティからFileオブジェクトを取得
    For Each objFile In objFolder.Files
        If objFile.Attributes And Hidden Then    '隠しファイル
        Else
            '隠しファイル以外を処理対象
            oMsg.AddAttachment objFile.Path
            strBody = strBody & objFile.Name & vbCrLf
            NewFile = NewFile & "Date[" & Date & "] Time[" & Time & "] File[" & objFile.Path & "]" & vbCrLf
        End If
    Next
 
    With oMsg
        .From = "管理部 <kanribu@*****.com>" '送信元
        .To = "課長 <katyou@*****.com>" '送信先
        .Cc = "担当1 様 <tantou@****.com>"
        .Bcc = "その他 様 <sonota@*****.com>"
        .Subject = "テスト送信の件" '件名
        .TextBody = strBody & NewFile
 
        With .Configuration.Fields
            .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "*******"
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
            .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "info@*****.com"
            .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "*********"
            .Update
        End With
        '送信
        .Send
    End With
    Set oMsg = Nothing
 
    'ログファイル書き込み
    Set objOutF = objFileSys.OpenTextFile("C:\FileSend\Fsend.log", 8)
    objOutF.Write NewFile
    objOutF.Close
    MsgBox "メール送信しました。", 0, "送信完了"
    Set objOutF = Nothing
 
    For Each objFile In objFolder.Files
        If objFile.Attributes And Hidden Then
        Else
            objFile.Delete
        End If
    Next
Else
    MsgBox "フォルダー """ & strPath & """ を参照出来ません。", vbCritical, "エラー"
End If
 
Set objFile = Nothing
Set objFolder = Nothing
Set objFileSys = Nothing

投稿日時: 21/01/21 17:15:03
投稿者: ラングドシャ

Suzu様
サンプルありがとうございます。
私はいろいろな所から集めてしまったコードなので重複している箇所があったんですね。
サンプルはすごくすっきりしていてきれいですね。
 
本日バタバタしていてまだ試すことができていないため、明日以降でテストしてみます。
ありがとうございます。

投稿日時: 21/01/22 13:27:15
投稿者: ラングドシャ

Suzu様
 
サンプル試させていただきました。
問題なく処理されました。
元にはなかった新機能も備えていただき感激です。
 
私なりに、昨日は指定ファイルを削除する方向でいろいろテストを行ってみましたが
ファイルが全部消えたりでなかなかうまくいかずでした。
 
分かる範囲にはなりますがいただいたサンプルを理解してみます。
 
ありがとうございました。