カテゴリー「フリーソフト」の32件の記事

2020年5月 6日 (水)

エクスプローラからファイル一覧を出力するVBScript(検索結果もOK)

本記事では、Windowsのファイルエクスプローラで表示・選択されているファイルの一覧(ファイル名、パス、サイズ、更新日時)をクリップボードに張り付ける方法について記載している。
これは、エクスプローラで検索した結果に対しても有効である。

実は、これは、以前の記事「エクスプローラでファイル名をクリップボードにコピーする」で紹介した内容の改良版で、前回との違いなどを最初に記載しているが、手っ取り早く試したい人は、【導入手順】から読んでほしい。


【前回記事内容と今回の変更点】

前回は(今回も同じであるが)以下の方法で実現している。

step1.対象ファイルを選択した状態でエクスプローラの右クリックメニュー →「送る」で特定のバッチファイルを選択
step2.バッチファイルが実行され、ファイルの情報をクリップボードへコピー
step3.(人が)テキストファイルやExcelに貼り付け

また、出力する情報別に、以下の3種類のバッチファイルを用意していた。

  1. ファイル名のみのの一覧(テキスト形式)
  2. パス、ファイル名、更新日時、ファイルサイズ の一覧(Excelに張り付けられるようTAB区切り)
  3. tree情報(Dosコマンドの tree の実行結果)

自分でも日々の業務の中で使用しており、特に 2 は重宝して使っていた。
エクスプローラ内のファイルの一覧を表示するのであれば、Dosコマンドの Dir でも何とかなるが(それでも Excel に貼って2次加工したい場合はひと手間必要)、エクスプローラで検索した結果の一覧を更新日時やサイズと合わせて出力する場合はこれ以外の方法はないと思う。

ところが、これまで使っていて、うまく動作しないケースを発見した。ファイル名やフォルダ名に全角空白が含まれる場合で、なぜか、全角空白で名称が分断され、2つのファイルやフォルダが存在するように誤動作してしまう。

この原因調査のためググってみたところ、以下の記事を発見した。

ファイル名に=;,や全角空白を使うときは、半角空白も併せて使うべし。
ファイルエクスプローラからバッチファイルへドラッグ&ドロップして正しいファイル名を得る方法


結果的には、これはバッチファイルの仕様(バグ?)でどうしようもないようである。それも、ファイル名やフォルダ名に一緒に半角空白が入っていればOKという謎仕様である。

そこで、バッチファイルの使用は諦め、1と2を VBScript で書き直したのが今回の記事である。VBScript はどの Windowsにも実装されているので、利用にあたって特に設定を変更したり何かのモジュールを導入する必要はない。


【導入手順】

Step1.

以下のリンクを右クリックし、メニューから「名前を付けてリンク先を保存」や「対象をファイルに保存」などを選択して VBScript ファイルをダウンロードし、ファイル名の最後の「.txt」を削除して(拡張子をvbsにして)保管したいフォルダに保存する。
それぞれ、上記の 1, 2 に対応しているので、どちらか一方でも問題ない。
文字コードは SJISを使っているため ブラウザ上で表示した場合は文字化けするので注意。

「1_copy_filenames.vbs.txt」をダウンロード
「2_copy_file_info_for_Excel.vbs.txt」をダウンロード

 

なお、「2_copy_file_info_for_Excel.vbs.txt」については、テキストエディタでファイルの先頭で定義されている定数を変更することで、以下のカスタマイズが可能である。(デフォルトで問題なければそのままで良い。)

  • fol_level_q = 0

フォルダが選択されている場合、サブフォルダ以下を階層的に調査するかを指定する。
     0:調査しない
     1:調査する
    -1:毎回確認画面でどちらかを指定する

  • Const def_fol_level = 20
       
       調査する場合の階層レベルを指定する。
        -1:制限なし
         0:サブフォルダは調査しない
         n:N階層まで調査

        通常 -1 でも問題ないが、シンボリックリンクなどがある場合に無限ループに陥る可能性があるので初期値は20にしている
        
  • Const fol_output = 1

   フォルダ自身の情報を1行として出力するかを指定
     1:出力する
     0:出力しない(ファイルの情報のみを出力する)
      

Step2.

Step1.で保存したバッチファイルのショートカットを SendToフォルダの直下に作成し、お好みで名称を判りやすいものに変更する。

SendToフォルダは、右クリックメニューで「送る」を選択した時に表示されるファイルを格納する場所で、エクスプローラ上部のパスが表示されるところに「shell:sendto」と入力して開くことができる。
私の場合(OSはWindows10 Home)は以下のフォルダである。
C:\Users\ユーザ名\AppData\Roaming\Microsoft\Windows\SendTo

 
【利用方法と実行例】

エクスプローラ上で対象ファイルやフォルダを選択し(複数選択可)、右クリック → 送る から 実行するVBScriptを選択して実行する。
その後、「1_copy_filenames.vbs」であればテキストエディタなどへ、「2_copy_file_info_for_Excel.vbs」であれば Excelの空シートに貼り付ける。


以下が貼り付けイメージである。

  • サンプルのファイル構成(青背景の4つを選択した状態で右クリック)

  E:\PROGRAM FILES (X86)\MOZILLA FIREFOX
  ├─Accessible.tlb
  ├─AccessibleHandler.dll
  ├─AccessibleMarshal.dll
  └─uninstall
    ├─helper.exe
    ├─shortcuts_log.ini
    ├─uninstall.log
    └─uninstall.update 

  • 1_copy_filenames.vbs の実行結果
     
      E:\Program Files (x86)\Mozilla Firefox  <= 1行目はパス
      Accessible.tlb
      AccessibleHandler.dll
      AccessibleMarshal.dll
      uninstall
     
  • 2_copy_file_info_for_Excel.vbs の実行結果
    • fol_level_q = 1 (サブフォルダを調査)で実行した場合
    • fol_level_q = 0 の場合は、6行目以降は表示されない

  Excel_image_001

 

もう1つ、検索結果についての貼り付け例を示す。

  • エクスプローラでの検索結果
    • Firefox のインストールフォルダ内で "log"を検索し4ファイルがヒット

Excel_image_002

  • 2_copy_file_info_for_Excel.vbs の実行結果
    • 検索結果の4ファイルとも選択して実行

Excel_image_003

 

では。

| | コメント (0)

2019年8月18日 (日)

outlookメールの添付ファイル名を検索するVBScriptを作成してみた

今回は、自分の仕事で使う目的で作成した「outlookを操作するVBScriptシリーズ」の恐らく最終回である。

これまでのこのシリーズの出し物は以下の通りである。

今回は、outlookの添付ファイルを検索し、ファイル名の中に、指定した文字列を含むものを検索するスクリプトである。

使い方は、以下の通りである。

まず、事前準備として、本記事の最後に添付されている「search_for_attached_files_in_outlook.vbs」を任意の場所に置いておく。
あとは、outlook上で検索対象のメールを選択した状態で(もちろん複数選択可)、このvbsファイルをダブルクリックして実行するだけである。

実行すると「ファイル名の一部を指定してください。」というメッセージと入力ウィンドウが現れるので検索文字列を入力すると、検索完了後に、

  • 1件でも見つかった場合は「N件のファイルが見つかりました。情報をクリップボードにコピーしました。」
  • 1件も見つからなかった場合は「該当ファイルは見つかりませんでした。」

のいずれかを表示し終了する。

前者の場合は、Ctrl-v などの貼り付け操作で、Excelやテキストエディタなどにクリップボードの内容を貼りつけると

見つかった添付ファイル名,  該当メールの受信日時,  件名,  送信者

の一覧(各項目はタブ区切り)を見ることができる。

留意事項としては以下の通り。

  • 一度に入力できる検索文字列は1つだけで、ファイル名の中に、その文字列を完全一致で含むものだけがヒットする。
  • 実行中にoutlookへのアクセス許可を求める以下のダイアログが表示された場合は「許可」を選択する。
    Outlook_acceess_permission

 

以下がスクリプトである。


Option Explicit

Dim objOA, objSelection, objItm, objAtt, objWS
Dim I, MySrch, MyCnt, Mystring

Set objOA = CreateObject("Outlook.Application")

Set objSelection = objOA.ActiveExplorer.Selection
If objSelection.Count = 0 Then
 MsgBox "メールが選択されていません。"
 WScript.Quit
End If

MySrch = InputBox("選択されたメールの添付ファイル名を検索します。" & vbCrLf & "ファイル名の一部を指定してください。")

If Len(MySrch) = 0 Then
 WScript.Quit
End If

MyCnt = 0
Mystring = ""
For I = 1 To objSelection.Count
 set objItm = objSelection.Item(I)
 For Each objAtt In objItm.Attachments
  If InStr(1,objAtt.FileName,MySrch,1) > 0 Then
   MyCnt = MyCnt + 1
   Mystring = Mystring & vbCrLf & objAtt.FileName & vbTab & objItm.ReceivedTime & vbTab & objItm.Subject & vbTab & objItm.Sender
  End If
 Next
Next

If MyCnt > 0 Then
 Mystring = "ファイル名" & vbTab & "受信日時" & vbTab & "件名" & vbTab & "送信者" & Mystring
 MsgBox(MyCnt & "件のファイルが見つかりました。情報をクリップボードにコピーしました。")
 Set objWS = CreateObject("WScript.Shell")
 objWS.Exec("clip").StdIn.Write Mystring
Else
 MsgBox("該当ファイルは見つかりませんでした。")
End If


 

ファイルのダウンロードは、以下のリンクを右クリックで「保存」(ファイルの文字コードは SJIS)

ダウンロード - search_for_attached_files_in_outlook.vbs

 

では。

 

| | コメント (0)

2019年5月 3日 (金)

outlookメールの添付ファイルを削除するVBScriptを作ってみた

今回も、自分の仕事で使う目的で作成した、outlookを操作するVBScriptシリーズである。

これまで、以下のVBScriptをアップしてきた。


私の場合、会社のメールサーバの容量が限られているので、定期的にサーバ上のメールを削除し、過去メールはデータファイル(pstファイル)にバックアップしている。
その際、データファイルの容量を極力小さくするため、サイズが大きく、かつ保存する必要のない添付ファイルは個別に削除しているのだが、そのためには以下の操作をメールの数だけ繰り返す必要がある。

  1. 対象メールを開く
  2. 添付ファイルを右クリックして削除
  3. メールを保存

そこで今回は、メールの添付ファイルを削除するVBScriptを作成してみた。

使い方は、以下の通りである。
まず、事前準備として、本記事の最後に添付されている「delete_attached_files_in_outlook.vbs」を任意の場所に置いておく。
あとは、outlook上で対象メールを選択した状態で(複数選択可)このファイルをダブルクリックし、確認ダイアログに回答するだけである。VBスクリプトなので、VBAと違いoutlookに組み込む必要はない。
途中で「1ファイルづつ確認しながら削除しますか?」と聞いてくるので、ここで「はい」を選択すると添付ファイル毎に メール件名、添付ファイル名、サイズ が表示されるので個別に削除するか否かを指定でき、「いいえ」を選択すると個別の確認はなく全添付ファイルが削除される。
また、outlookへのアクセス許可を求める以下のダイアログが表示された場合は「許可」を選択する。

 Outlook_acceess_permission

 

以下がスクリプトである。


Option Explicit

Dim objOA, objSelection, objItm, objAtt, objAtts
Dim I, MyDlt, MyMsg, MyCnt, MyCnfm, MyChng, MyIdx

Set objOA = CreateObject("Outlook.Application")

Set objSelection = objOA.ActiveExplorer.Selection
If objSelection.Count = 0 Then
 MsgBox "メールが選択されていません。"
 WScript.Quit
Else
 MyMsg = "★★警告★★" & vbCrLf & "以下のメールの添付ファイルが削除されます。良いですか?"
 MyCnt = 0
 For I = 1 To objSelection.Count
  set objItm = objSelection.Item(I)
  If objItm.Attachments.count > 0 Then
   MyCnt = MyCnt +1
   MyMsg = MyMsg & vbCrLf & Right(Space(5) & MyCnt, 5) & ": "& objItm.Subject
  End If
 Next
 If (MyCnt = 0) Then
  MsgBox "添付ファイル付きのメールが1通も選択されていません。"
  WScript.Quit
 Else
  If MsgBox(MyMsg, vbYesNo) = vbNo Then
   WScript.Quit
  End If
 End If 
End If

MyCnfm= MsgBox ("1ファイルづつ確認しながら削除しますか?", vbYesNoCancel)
If MyCnfm = vbCancel Then
 WScript.Quit
End If

For I = 1 To objSelection.Count
 set objItm = objSelection.Item(I)
 Set objAtts = objItm.Attachments
 If objAtts.Count > 0 Then
  MyChng = vbNo
  MyIdx = 1
  While objAtts.Count > MyIdx - 1
   set objAtt = objAtts.Item(MyIdx)
   If MyCnfm = vbYes Then
    MyDlt = MsgBox ("以下のファイルを削除しますか?" & vbCrLf & " メール件名[" & objItm.Subject & "]" & vbCrLf & " ファイル名[" & objAtt.FileName & "]" & vbCrLf & " サイズ[" & Round(objAtt.Size/1024) & "KB]", vbYesNoCancel)
    If MyDlt = vbCancel Then
     WScript.Quit
    ElseIf MyDlt = vbYes Then
     objAtts.Remove(MyIdx)
     MyChng = vbYes
    Else 'MyDlt = vbNo
     MyIdx = MyIdx + 1
    End If
   Else
    objAtts.Remove(MyIdx)
    MyChng = vbYes
   End If
  Wend
  If MyChng = vbYes Then
   '既読に変更
   objItm.UnRead = False
   '変更を保存
   objItm.Save
  End If
 End If
Next


 

ファイルのダウンロードは以下のリンクを右クリックで「保存」を選択(ファイルの文字コードは SJIS)

ダウンロード - delete_attached_files_in_outlook.vbs

 

では。

| | コメント (0)

2019年5月 2日 (木)

outlookからメールと添付ファイルを出力する(その2)

以前の記事「outlookからメールと添付ファイルを抽出するVBScriptを作ってみた」で、outlookからメールと添付ファイルを取り出すVBScriptを紹介した。

そのバージョンでは、あらかじめ対象メールをoutlookの指定フォルダにコピーしておかなければならなかったが、今回、その改良版としてoutlook上で選択されたメールを対象とするように仕様変更したので紹介する。
なお、私が試した環境は、Windows7とoutlook2010の組合せのみである。

主な機能は以下の通りである。

  • outlookのメールを、msgファイルとして、Windowsの指定フォルダに出力する。ファイル名は「YYYYMMDD_HHMMSS_メール件名.msg」で YYYYMMDD HHMMSS はメールの受信日時である。
  • オプションで、メールの添付ファイルを同じフォルダ直下の「添付_YYYYMMDD_HHMMSS_メール件名」というフォルダの下に出力することも選択可能。更に、オプションで、添付ファイル出力後、メールの添付ファイルを削除し、代わりに「添付ファイルを出力したフォルダのパスを記載したテキストファイル(ファイル名「元の添付ファイルの保存先フォルダ.txt」)」をメールに添付することも可能。

使い方は、以下の通りである。
まず、事前準備として、本記事の最後に添付されている「export_from_outlook.vbs」を任意の場所に置いておく。
あとは、outlook上で対象メールを選択した状態で(複数選択可)、このファイルをダブルクリックするだけである。VBスクリプトなので、VBAと違いoutlookに組み込む必要はない。

ダブルクリック後の手順をもう少し説明する。

  1. ダブルクリックすると「n 通のメールが選択されています。続けますか?」ときいてくるので「はい」を選択する。
  2. 以下のダイアログが表示されるので、出力先(格納先)フォルダを選択する。なお、ダイアログの下の「フォルダー(F):」にフルパスを直接貼り付けても良い。

    Folder_dialog

  3. 「添付ファイルを取り出しますか?」というダイアログが表示されるので「はい」「いいえ」のいずれかを選択する。
    「いいえ」を選択した場合は msgファイルのみ、「はい」を選択した場合は msgファイルに加え添付ファイルも抽出される。
  4. 3で「はい」を選択した場合、「添付ファイルを削除しますか?」というダイアログが表示されるので「はい」「いいえ」のいずれかを選択する。「はい」を選択した場合、元のメールの添付ファイルは削除されるので注意。
  5. 4で「はい」を選択した場合、「保存先フォルダを記載したテキストファイルを添付しますか?」というダイアログが表示されるので「はい」「いいえ」のいずれかを選択する。ここで「はい」を選択した場合、元の添付ファイルは削除されるが、代わりに添付ファイルを出力したフォルダのパスを記載したテキストファイルが添付される。なお、いずれの場合も、元が添付ファイル付きメールの場合、抽出された msgファイルには添付ファイルが含まれている。
  6. outlookへのアクセス許可を求める以下のダイアログが表示されるので、「許可」を選択する。

    Outlook_acceess_permission 

手順は以上である。


以下がスクリプトである。


Option Explicit

Dim objOA, objSelection, objShell, objFolder, objFSO, objItm, objAtt, objWss, objTxt
Dim MyDate, MyFileName, MyFolder, MySubFolder, MyMsgPath, YNCont, YNExt, YNDel, YNRplc, ENVtmp, MyTmpTxt, MyMsg, MyCnt, I

Const olMSG = 3
Const ErrReject = -2147467260

'添付ファイル格納サブフォルダ名の接頭語
Const PreWord = "添付_"
'元の添付ファイルの保存先フォルダを記載した添付ファイル名
Const AttFileName = "元の添付ファイルの保存先フォルダ.txt"

Set objOA = CreateObject("Outlook.Application")

Set objSelection = objOA.ActiveExplorer.Selection
If objSelection.Count = 0 Then
 MsgBox "メールが選択されていません。"
 WScript.Quit
Else
 YNCont = MsgBox(objSelection.Count & " 通のメールが選択されています。続けますか?", vbYesNo)
 If YNCont = vbNo Then
  WScript.Quit
 End If
End If

Set objShell = WScript.CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder( 0 , "フォルダを選択して下さい" , &h4050 , &h11)

If (objFolder Is Nothing) Then
 WScript.Quit
End If
MyFolder = objFolder.Items.Item.Path

'MsgBox "MyFolder = " & MyFolder

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If Not(objFSO.FolderExists(MyFolder)) Then
 MsgBox("存在しないフォルダが指定されました")
 WScript.Quit
End If

MyCnt = 0
For I = 1 To objSelection.Count
 set objItm = objSelection.Item(I)
 If objItm.Attachments.count > 0 Then
  MyCnt = MyCnt + 1
 End If
Next

YNExt = vbNo
If MyCnt > 0 Then
 YNExt = MsgBox("添付ファイルを取り出しますか?", vbYesNoCancel)
 If YNExt = vbCancel Then
  WScript.Quit
 ElseIf YNExt = vbYes Then
  YNDel = MsgBox("添付ファイルを削除しますか?", vbYesNoCancel)
  If YNDel = vbCancel Then
   WScript.Quit
  ElseIf YNDel = vbYes Then
   YNRplc = MsgBox("保存先フォルダを記載したテキストファイルを添付しますか?", vbYesNo)
   If YNRplc = vbYes Then
    MyMsg = "★★警告★★" & vbCrLf & "以下のメールの添付ファイルが置き換えられます。良いですか?"
   Else
    MyMsg = "★★警告★★" & vbCrLf & "以下のメールの添付ファイルが削除されます。良いですか?"
   End If
   MyCnt = 0
   For I = 1 To objSelection.Count
    set objItm = objSelection.Item(I)
    If objItm.Attachments.count > 0 Then
     MyCnt = MyCnt +1
     MyMsg = MyMsg & vbCrLf & Right(Space(5) & MyCnt, 5) & ": "& objItm.Subject
    End If
   Next
   If MsgBox(MyMsg, vbYesNo) = vbNo Then
    WScript.Quit
   End If 
  End If
 End If
End If

Set objWss = WScript.CreateObject("WScript.Shell")
ENVtmp = objWss.expandEnvironmentStrings("%TMP%")

For I = 1 To objSelection.Count
 set objItm = objSelection.Item(I)
 
 MyDate = objItm.ReceivedTime
 MyDate = Replace(MyDate, "/", "")
 MyDate = Replace(MyDate, ":", "")
 MyDate = Replace(MyDate, " ", "_")

 MyFileName = MyDate & "_" & objItm.Subject

 '使用禁止文字を置換する
 MyFileName = Replace(MyFileName, "?", "?")
 MyFileName = Replace(MyFileName, ":", ":")
 MyFileName = Replace(MyFileName, "/", "/")
 MyFileName = Replace(MyFileName, "\", "¥")
 MyFileName = Replace(MyFileName, "*", "*")
 MyFileName = Replace(MyFileName, """", "”")
 MyFileName = Replace(MyFileName, "<", "<")
 MyFileName = Replace(MyFileName, ">", ">")
 MyFileName = Replace(MyFileName, "|", "|")
 
 MyMsgPath= MyFolder & "\" & MyFileName & ".msg"
 
' MsgBox MyMsgPath
 
 Err.clear
 On Error Resume Next

 objItm.SaveAs MyMsgPath , olMSG
 
 If (Err.Number = ErrReject) Then
  MsgBox "終了します"
  WScript.Quit
 End If

 On Error Goto 0

 If (YNExt = vbYes) and (objItm.Attachments.count > 0) Then
  
  MySubFolder = MyFolder & "\" & PreWord & MyFileName

  If objFSO.FolderExists(MySubFolder) = True Then
   MsgBox "フォルダ " & MySubFolder & " は既に存在しています。"
  Else
   objFSO.CreateFolder(MySubFolder)
  End If

  For Each objAtt In objItm.Attachments
   objAtt.SaveAsFile MySubFolder & "\" & objAtt.FileName
  Next
  
  If YNDel = vbYes Then
   Set objAtt = objItm.Attachments
   While objAtt.Count > 0
    objAtt.Remove 1
   Wend
   '既読に変更
   objItm.UnRead = False
   '変更を保存
   objItm.Save
   
   If YNRplc = vbYes Then
    MyTmpTxt = ENVtmp & "\" & AttFileName
    Set objTxt = objFSO.OpenTextFile(MyTmpTxt, 2, true)
    objTxt.Write(MySubFolder)
    objTxt.Close
    objItm.Attachments.Add(MyTmpTxt)
    objItm.Save
    objFSO.DeleteFile MyTmpTxt, True
   End If
  End If
 End If
Next


ファイルのダウンロードは以下のリンクを右クリックで「保存」を選択(ファイルの文字コードは SJIS)

ダウンロード - export_from_outlook.vbs

 

どうぞご自由に。

| | コメント (0)

2018年12月31日 (月)

outlookのメール一覧をExcelに貼り付けるためのVBScriptを作ってみた

前回の記事で、outlookから msgファイルと添付ファイルを抽出するVBScriptを公開したが、その応用編として、メールの件名や内容の一覧をExcelに貼り付けるVBScriptを作成したので公開する。
スクリプトの大半は前回のものの流用であるが、添付ファイルやWindowsのフォルダを扱わないのでこちらの方がシンプルである。

それでは、まず仕様から。

  • outlook上の特定メールフォルダに格納されているメールを対象とする。従って、実行前に対象メールを「特定メールフォルダ」にコピーする必要がある。
    【2019年5月2日追記】
    対象メールを「outlookで選択されているメール」に改良したバージョンを作成したので、興味のある方は本記事の文末を参照。
  • 本スクリプトではExcelへの貼り付け自体は行わず、タブ区切りの一覧をクリップボードにコピーするまでを行う。従って、本スクリプトを実行した後、Excelの任意のセルを選択して貼り付け操作をすれば一覧がExcelに展開される。
  • 貼り付けられる項目は、受信日時、件名、送信者、本文 とした。

以下、本スクリプトの利用手順である。

  1. 対象ファイルを outlookの受信フォルダ直下の「export」フォルダにコピーする。フォルダ名はスクリプトの10行目で定義しており変更は可能だが、事前に決めておく必要がある。
  2. 本スクリプトをダブルクリックで実行する。
  3. outlookへのアクセス許可を求める以下のダイアログが表示されるので、「許可」を選択する。
    Outlook_acceess_permission
     
  4. Excelの任意のセルを選択し、貼り付け操作(Control-vなど)を行う。
     

テストした環境は Windows7と Office2010の組合せのみなのであしからず。
スクリプト(コードはSJIS)は以下のリンクからご自由に。(右クリックして保存)

「outlook2tsv.vbs」をダウンロード

読みにくいが、内容は以下の通り。


Option Explicit

Dim objOA, objNS, objOLFolder, objItm, objWS
Dim Mystring

Const olFolderInbox = 6
Const ErrNoOLFolder = -2147221233

'outlook の対象フォルダ名(受信トレイの下)
Const oLFolderName = "export"

Mystring = "受信日時" & vbTab & "件名" & vbTab & "送信者"& vbTab & "本文" & vbCrLf

Set objOA = CreateObject("Outlook.Application")
Set objNS = objOA.GetNamespace("MAPI")

Err.clear
On Error Resume Next

Set objOLFolder = objNS.GetDefaultFolder(olFolderInbox).Folders(oLFolderName)

If (Err.Number = ErrNoOLFolder) Then
  MsgBox "指定した outlook のフォルダ " & oLFolderName & " が存在しません"
  WScript.Quit
End If

On Error Goto 0

For Each objItm In objOLFolder.Items
  Mystring = Mystring & objItm.ReceivedTime & vbTab & objItm.Subject & vbTab & objItm.Sender & vbTab & """" & objItm.Body & """" & vbCrLf
Next

Set objWS = CreateObject("WScript.Shell")
objWS.Exec("clip").StdIn.Write Mystring


では。

 

【2019年5月2日追記】

以下の改良を行ったバージョンを作成したので、興味のある方は下記リンクから。(右クリックして保存)

  • 対象メールを「outlookの特定メールフォルダ下にあるメール」から「outlook上で選択されているメール」に変更
  • メール本文がHTML形式の場合、異常終了する不具合に対応(ただし、HTML形式の場合、 "?"などの不正文字が残ることがある)

ダウンロード - export_mails_from_outlook_in_tsv_format.vbs

 

 

 

| | コメント (0) | トラックバック (0)

2018年12月30日 (日)

outlookからメールと添付ファイルを抽出するVBScriptを作ってみた

会社ではメーラとして outlookを使っている。
個人的には検索のアホさを始めとした、もろもろの使い勝手の悪さに辟易しているが、会社の標準なので付き合わざるを得ない。

特に最近面倒くささを感じていたのがメールのダウンロード(抽出)だ。エクスプローラにドラッグ&ドロップすればメールファイル(msgファイル)が作成されるのだが

  • 添付ファイルは個別にコピペする必要がある。
  • msgファイルの名称がメール件名となるので、返信を繰り返したメールだと全て同じファイル名になり、いちいちリネームする必要がある。
  • ファイル名を見ただけでは受信日時がわからない

といった不満がある。多分 outlookマクロを作成すれば解決できるのかも知れないが、会社では勝手にマクロを組み込むのは不可である。

いろいろとググってみると、VBScriptでも outlookの操作が可能のようである。VBScriptは Windowsで動作するスクリプト言語で個人的には全く馴染みがないが、

  • Windowsであれば、何の事前準備も不要でダブルクリックで実行できる
  • Officeの操作も可能
  • 細かな文法やテクニックを知らなくても、Web上で公開されているコードを組み合わせれば何とかなりそう

という点がメリットである。

と言うことで、休み時間などを利用して半月ほどで一通り使えそうなものができたので、公開することにした。

まず、仕様は自分の好みで以下とした。

  • outlook上の特定メールフォルダに格納されているメールを抽出対象とする。従って、抽出前に対象メールを「特定メールフォルダ」にコピーする必要がある。outlook上で対象メールを右クリックして抽出できれば一番良いのだが、これは VBScriptを使う限りは無理だと思う。
    【2019年5月2日追記】
    抽出対象メールを、「特定メールフォルダに格納されているメール」から「outlookで選択されているメール」に改良したバージョンを作成したので、興味のある方は本記事の文末を参照。
  • msgファイルだけを抽出するか、添付ファイルも抽出するかを選択可能とした。
  • 抽出した msgファイルの名称は「YYYYMMDD_HHMMSS_件名.msg」となる。ここで、YYYYMMDD_HHMMSSはメールの受信日時である。
  • 添付ファイルは、「A_YYYYMMDD_HHMMSS_件名」という名称のサブフォルダの下にオリジナルのファイル名で格納される。頭の「A_」はスクリプトの15行目で定義しており変更可能である。
  • メール件名には使えるが Windowsのフォルダ名には使えない特殊記号「?:/\*"<>|」は全角文字に変換される。

 

以下、本スクリプトを使った、outlookからメール(msgファイル)と添付ファイルを抽出する手順である。

  1. 対象メールを outlookの受信フォルダ直下の「export」フォルダにコピーする。このメールフォルダ名はスクリプトの12行目で定義しており変更は可能だが、事前に決めて作成しておく必要がある。
  2. 本スクリプトをダブルクリックで実行する。
  3. 以下のダイアログが表示されるので、抽出先(格納先)フォルダを選択する。なお、ダイアログの下の「フォルダー(F):」にフルパスを直接貼り付けても良い。
    Folder_dialog


  4. 「添付ファイルを取り出しますか?」というダイアログが表示されるので「はい」「いいえ」のいずれかのボタンをクリックする。
    「いいえ」を選択した場合は msgファイルのみ、「はい」を選択した場合は msgファイルに加え添付ファイルも抽出される。なお、いずれの場合も、元が添付ファイル付きメールの場合、抽出された msgファイルを開けば添付ファイルも含まれている。
  5. outlookへのアクセス許可を求める以下のダイアログが表示されるので、「許可」を選択する。
    Outlook_acceess_permission

これで指定した抽出先フォルダに msgファイルや添付ファイルが格納される。

テストした環境は Windows7と Office2010の組合せのみなのであしからず。
スクリプト(コードはSJIS)は以下のリンクからご自由に。(右クリックして保存)
 ⇒ 改良版を作成したので原則そちらを利用していただきたい。文末の【2019年5月2日追記】参照。

「outlook2msg.vbs」をダウンロード

 

読みにくいが、内容は以下の通り。
なお、姉妹編として、メールの件名や内容の一覧をExcelに貼り付けるVBスクリプトも公開したので、興味のあある方はココへ。


Option Explicit

Dim objOA, objNS, objOLFolder, objShell, objFolder, objFSO, objItm, objAtt
Dim MyDate, MyFileName, MyFolder, MySubFolder, MyMsgPath, MyYesNo

Const olFolderInbox = 6
Const olMSG = 3
Const ErrNoOLFolder = -2147221233
Const ErrReject = -2147467260

'outlook の対象フォルダ名(受信トレイの下)
Const oLFolderName = "export"

'添付ファイル格納サブフォルダ名の接頭語
Const PreWord = "A_"

Set objOA = CreateObject("Outlook.Application")
Set objNS = objOA.GetNamespace("MAPI")

Err.clear
On Error Resume Next

Set objOLFolder = objNS.GetDefaultFolder(olFolderInbox).Folders(oLFolderName)

If (Err.Number = ErrNoOLFolder) Then
MsgBox "指定した outlook のフォルダ " & oLFolderName  & " が存在しません"
WScript.Quit
End If

On Error Goto 0

Set objShell = WScript.CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder( 0 , "フォルダを選択して下さい" , &h4050 , &h11)

If (objFolder Is Nothing) Then
WScript.Quit
End If

MyFolder = objFolder.Items.Item.Path
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If Not(objFSO.FolderExists(MyFolder)) Then
MsgBox("存在しないフォルダが指定されました")
WScript.Quit
End If

MyYesNo = MsgBox("添付ファイルを取り出しますか?", vbYesNoCancel)
If MyYesNo = vbCancel Then
WScript.Quit
End If

For Each objItm In objOLFolder.Items

MyDate = objItm.ReceivedTime
MyDate = Replace(MyDate, "/", "")
MyDate = Replace(MyDate, ":", "")
MyDate = Replace(MyDate, " ", "_")

MyFileName = MyDate & "_" & objItm.Subject

'使用禁止文字を置換する
MyFileName = Replace(MyFileName, "?", "?")
MyFileName = Replace(MyFileName, ":", ":")
MyFileName = Replace(MyFileName, "/", "/")
MyFileName = Replace(MyFileName, "\", "¥")
MyFileName = Replace(MyFileName, "*", "*")
MyFileName = Replace(MyFileName, """", "”")
MyFileName = Replace(MyFileName, "<", "<")
MyFileName = Replace(MyFileName, ">", ">")
MyFileName = Replace(MyFileName, "|", "|")

MyMsgPath= MyFolder & "\" & MyFileName & ".msg"

Err.clear
On Error Resume Next

objItm.SaveAs MyMsgPath , olMSG

If (Err.Number = ErrReject) Then
  MsgBox "終了します"
  WScript.Quit
End If

On Error Goto 0

If (MyYesNo = vbYes) and (objItm.Attachments.count > 0) Then

  MySubFolder = MyFolder & "\" & PreWord & MyFileName

  If objFSO.FolderExists(MySubFolder) = True Then
   MsgBox "フォルダ " & MySubFolder & " は既に存在しています。"
  Else
   objFSO.CreateFolder(MySubFolder)
  End If

  For Each objAtt In objItm.Attachments
   objAtt.SaveAsFile MySubFolder & "\" & objAtt.DisplayName
  Next

End If

Next


 

【2019年5月2日追記】

以下の改良を行ったバージョンをアップしたので、興味のある方は ココへ。

  • 対象メールを「outlookの特定メールフォルダ下にあるメール」から「outlook上で選択されているメール」に変更
  • 添付ファイル抽出と同時に、元のメールの添付ファイルを削除するオプションを追加

 

| | コメント (0) | トラックバック (0)

2018年9月 8日 (土)

右クリックで更新日時を変更する方法(インストール不要)

とある理由で、会社のWindows PCでファイルの更新日時を変更する必要が生じたのだが、標準機能ではできないようだ。フリーソフトを使えばできるのだが、会社の規則でそれはNGだ。
ということで、いろいろとググって自分なりに目的を達成したので共有しておく。

一言でいうと、powershellに更新日時を変更するコマンドがあるので、それをエクスプローラ上の右クリックで呼び出すように設定するという方法である。なお、powershellは WindowsXP SP2以降には標準で搭載されている。

以下に手順を列挙する。

  1. まず最初に、「拡張子を表示しない」設定にしている人は、「拡張子を表示」などでググって、表示されるようにしておく。
  2. 以下の3行のスクリプトをメモ帳などに貼り付け、任意の場所に「更新日時変更.bat」というファイル名で格納する。
     
    • @echo off
    • set /p datime="更新日時変更(YYYY/MM/DD hh:mm:ss):"
    • powershell -NoProfile -ExecutionPolicy Unrestricted -Command "& { Set-ItemProperty \"%~1\" -Name LastWriteTime -Value \"%datime%\" }"
       
  3. エクスプローラ上部のパスが表示されるところに「shell:sendto」と入力して、sendto フォルダを表示する。
    このフォルダは、エクスプローラ上で、フォルダやファイルの右クリックメニューの「送る」を選択した時に表示されるものを格納する場所である。
  4. 2.で作成した「更新日時変更.bat」というファイルのショートカットを sendoto フォルダに移動させ、ショートカットの名称を「更新日時変更」に変更する。

これで完成である。

 

実際に使ってみる。

更新日時を変更したいファイルを選択し、右クリックメニューから「更新日時変更」を選択する。

 右クリックメニュー
 Change_datime_005

なお、メニューの中に表示されている、「copy1_フォルダ名とファイル名をコピー」「copy2_Excel用ファイル情報をコピー」「copy3_tree情報をコピー」という機能については、以前の記事「エクスプローラでファイル名をクリップボードにコピーする」で紹介したので興味のある方はどうぞ。

コマンドウィンドウが表示されるので、そこで 変更したい日時を入力する。

 2018年5月1日10時を指定した例(下線部分を入力)
 Change_datime_004

 指定通り、更新日時が変わった
 Change_datime_006

なお、作成日時を変更する場合は、手順2のスクリプトで「LastWriteTime」を「CreationTime」に変えればよい。

では。

| | コメント (0) | トラックバック (0)

2018年2月18日 (日)

Windows10のシステムドライブの復旧

やってしまった ・・・・

先日、ある操作をした影響で、PCのUSB機器が一切使えなくなってしまった。
ちょっとした気の迷いから、私の使っているマザーボードのメーカー ASUSが提供している「USB 3.0 Boost」というユーティリティソフトの実行ファイルを手動で直接実行したのだが、その瞬間からこのありさまである。

全てのUSB機器が使えないので、キーボードもマウスも反応せず、正に手も足も出ない状態である。PS/2のキーボードがあれば動作するのだろうがそんなものはない。

まずは、電源ボタン長押しでリブートしたのだが、それでも状況は変わらず。
次に考え付いたのは、復元ポイントからの復旧。以前、古いPC(Windows Vista)がある日突然、異常に動作が遅くなったことがあったが、自動保存されていた復元ポイントに戻して復旧したことがある。
その時はリブート中にF8キーを連打してセーフモードに移行してから復元ポイントに戻したのだが、今回はF8を押してもセーフモードにならない。どうもWindows10は F8ではダメなようで、結局、起動後に電源ボタン長押しで強制リブートすることを2回繰り返すことで、自動修復モードで立ち上がった。
幸いなことに自動修復モードではキーボードやマウスが使えたのでいろいろとあがいてみた。

 自動修復モードで「トラブルシューティング」を選択
 Recovery_pc_002_1

 トラブルシューティング画面で「詳細オプション」を選択
 
Recovery_pc_003

 詳細オプション画面
 Recovery_pc_004

 
ここからいくつかのオプションが選べるのだが ・・・

事前に正常時のシステムイメージを保存していれば「イメージでシステムを回復」を使えるのだが、過去にイメージを保存した記憶がなく、ダメ元でやってみたがやっぱりダメだった。

 システムイメージの選択画面だが、「イメージがない」と表示
 
Recovery_pc_005

スタートアップ設定」を選択するとセーフモードで立ち上げることができたが、残念ながら今回はセーフモードでもキーボードやマウスは使えなかった ・・・ ここで少し焦る

システムの復元」で復元ポイントからの復旧を行おうとしたが、何と復元ポイントが一切作られていなかった ・・・
古い Windows VistaのPCでは特に意識せずに自動で復元ポイントが作成されていたが、それはメーカ製のPCだったのでそのように初期設定されていただけで、本来は自分で初期設定する必要があったのだとトラブルになって初めて気付かされた。私も今回のトラブル復旧後に遅まきながら設定をしたので、本記事の最後に設定方法を載せておく。

参考までに復元ポイントがある場合の復旧の流れは以下の通り。

 システムの復元画面で「次へ」を選択
 Recovery_pc_006

 戻したい復元ポイントを選択
 Recovery_pc_008

復元ポイントでの復旧手順は以上である。

 

さて、こうなったら、本当に最後の手段を使うしかない。
私の場合、バックアップはフリーソフトを使って

  • Cドライブ(システムドライブ SSD 120GB)は EaseUS ToDo Backup のシステムバックアップ
  • Eドライブ(データドライブ HDD 3TB)は BunBackup にて差分バックアップ

を手動で適当なタイミングで実行して別ドライブ(バックアップドライブ HDD 3TB)に保存している。

今までこれらのバックアップが陽の目を見ることはなかったが、ついにその時がきたようだ。
今回はシステムドライブの復元、すなわち、現在のCドライブの SSDの内容を、過去にバックアップしておいた ドライブイメージで全て上書きすることになるのでかなりドキドキである。

以下が EaseUS ToDo Backup 10.0 を使った復旧手順である。
なお、システムドライブを復元するには、事前に EaseUS ToDo Backup でブータブルディスクをCD/DVD/USBメモリなどに作成しておく必要がある。私は3年前にCD-RWに作成していたのでそれを使った。なお、その時のバージョンと最新の10.0とではブータブルディスクで立ち上げた時の画面が少し異なっていた。
以下の画面ハードコピーは、復旧後に、最新バージョンで採取しなおしたものである。

まず、ブータブルディスクでPCを立ち上げる。すると WindowsPE 環境上で、いきなりEaseUS ToDo Backup の画面が開く。

 初期画面で「Browse to Recover」 を選択
 Recovery_pc_009

 復元に使うバックアップファイル(ドライブイメージ)を選択
 Recovery_pc_010

 選択したドライブイメージの構成が表示されるので Next を選択
 Recovery_pc_011

 どのドライブに復元するかを指定
 Recovery_pc_012

今回は システムドライブ(Hard disk 0)を上書きするのでそれを選択。
SSD の場合は「Optimize for SSD」をチェックした方が良いと思われる。これは、パーティションアラインメントを調整する機能だと思われるが、私の場合、古いバージョンだったせいか、このオプションがなかったような気がするが、特に意識しなくても 復元したSSDの アライメントに問題はなかった。

 上書きの警告画面がでるので OK
 Recovery_pc_013

 約1時間待って完了(120GBのSSDをHDDから復元した場合)
 Recovery_pc_015

これで、PCを再起動したら、無事、復元したSSDで立ち上がった。
やはり、バックアップは大事であることを痛感した出来事であった。EaseUS ToDo Backup にも感謝である。

 

最後に、復元ポイントを作成する方法である。

スタートボタンを押下し「復元ポイント」と入力し、表示された「復元ポイントの作成」を選択。

Recovery_point_001_1

システムのプロパティ画面で、Cドライブの保護が有効になっているか確認。
無効になっている場合は「構成」を選択。

Recovery_point_001_2

「システムの保護を有効にする」を選択し、「ディスク領域の使用量」で復元ポイントの格納領域のサイズをドライブ全体の割合で指定する。
私の場合、5%(約5.5GB)と指定。1回の作成サイズが1.2GB程度なので直近4回が保存可能

Recovery_point_004

この後、最初の1回は試しに手動で作成することをお勧めする。具体的には、システムのプロパティ画面で1番下の「作成」ボタンで作成する。

では。

| | コメント (0) | トラックバック (0)

2018年1月 5日 (金)

普通に使える Androidのメールアプリ

以前の記事「昨年(2014年)後半のお買物 (D-M430 と Zenfone5)」で書いたように、スマホはASUSのSIMフリー機 Zenfone5を使ってきた。ゲームなど重いアプリは使わないので、今まで特に困ることはなかったのだが、さすがにバッテリの持ちが少し悪くなってきたのと、万が一ポックリ逝った時に代替機がないことから、3年経った昨年(2017年)11月に新しい機種を購入した。

機種選定の基準は、Androidの SIMフリー機で、サイズは片手でギリ使える 5.2inch、価格は3万程度でコスパの良いものとした。
この観点で見ると ASUS以外に Huaweiの機種も候補となるが、通信を行い、かつバージョンアップもある機器では、正直、大陸メーカーのものは使いたくない。(別に中国政府が欲しい情報を扱っている訳ではないが ・・・
と言うことで、Zenfone4も出て少し価格がこなれた感のある ASUS Zenfond3(型番 ZE520KL) をターゲットとした。

なるべく安く購入するためにヤフオクやメルカリも含めて探してみたのだが、結局、昨年(2017年)10月に、たまたま立ち寄った秋葉原の ソフマップ中古デジタル館で未開封品(中古)を 26,978円(税込)で見つけ購入した。ソフマップは比較的高いイメージがありこれまでスルーしていたが、新古品は開封/未開封に限らず全店舗統一価格のようで、未開封品で1ヶ月保証がついてこの価格は納得できるものであった。

購入前は、新機種への環境移行作業が面倒くさいのではないかと思っていたが、画面の指示に従うだけであっけなく終了し、Zenfone5に導入していたアプリもその時点の最新版が自動でインストールされた。

ただし、以下のものは自動で移行されなかった。

  1. ASUS純正のメールアプリ
    Asusemail
  2. ASUS純正のPCLink・・・PCからの遠隔操作(ミラーリング)アプリ
    Asuspclink
  3. TubeMate YouTube Downloader
    Tubemate

3は Google Playに置かれてないので、個別にインストールを行った。
1, 2 は何故かZenfone3ではサポートされなくなったので、代わりを探すことにした。

2は私のようなスマホ入力が苦手の者が、フリマアプリなどで比較的長い文を入力する時に非常に助かるアプリである。少々の画像の荒さや動きの鈍さは許容できるが、PCからテキストをコピペできることは必須である。(要は、入力するのではなく、PCで作成した文のコピペが基本である。)
いくつかのアプリを試用した中で、結局普通に使えたのは Vysorだけであった。
Vysor
Vysorは、PC側はChrome上で動作するというちょっと変わった作りで、インストール方法や使い方は以下のサイトが詳しい。特に、スマホのキーボードの設定を「Vysor」に変更することが肝である。
Androidスマホをパソコンで手軽に操作できるChromeアプリVysor

 
最後は 1のメールアプリである。
私の場合 SIMフリーなので3大通信キャリアのメールは使わないが、nifty、Yahoo、Google、(nuro光のプロバイダとして)So-net、(SIMのプロバイダとして)mineo のアカウントを持っており、それらが一括して扱えることが条件で、あとは使い勝手や見た目くらいが選考基準である。もちろんASUS純正のメールアプリでもこの条件を満たしていた。
メールアプリは、上記の2や3と違って誰もが必要とするものなので、「普通に使える」アプリがたくさんあるものと甘く見ていたのだが ・・・・

アプリ紹介サイトやGoogle Playを見て、なるべく癖がなさそうで評価の高いソフトから試してみた。

まずは、ド定番の Gmail
Gmail
各アカウントの設定まで問題なく終了し利用開始したのだが、使ってみると以下の問題があった。

  • アプリを開いた時に、全てのアカウントのメールがまとめて表示される「統合ビュー」で見たいのだが、いつも1つだけののアカウントの表示状態になっており、毎回「すべての受信トレイ」を選択しなおす必要がある
  • メールの本文中に記載されているURLがリンクにならない

後者は仕様とのことだが、前者については、どこかに設定があるのかと探してみたが見つけきれず、結局1ヶ月程度で次のアプリを探すこととなった。

次にトライしたのが「フリー電子メールアプリ日本 by Mail.Ru」というアプリ。
Freeemail
Google Playでの評価は高かったものの何故か Yahooメールのアカウントが登録できない。
本アプリや後述のmyMailやBlueMailなどの海外製のアプリでは、GmailやYAHOO!などの主要メールアカウントの設定が事前登録されており、それらから選択すれば最低限の入力だけでアカウントの初期登録が完了するお助け機能がついている。ただし、日本のYahooメールは米国の「YAHOO!」とは別物なので「その他(other)」を選択しなければならないというのは「あるある」なのだが、このアプリは自動設定のおせっかいの度が過ぎているためか「その他」から設定しても米国YAHOO!の設定になってしまいうまくいかない。
結局、実際に使うことなくアプリ削除となった。

次は myMail
Mymail
これも評価は高かったが、Gmailで言うところの統合ビュー(全アカウントの受信メールをまとめてみる画面)の機能がなく却下。また、アカウントの初期登録は一番簡単であったが、実際にどのように設定されたかを確認・修正する「詳細設定画面」がないのも私的には気持ち悪く減点ポイントであった。

結局、今使っているのは BlueMailである。
Bluemail
上に挙げた他のアプリの欠点はいずれもクリアされており、ストレスなく「普通に使える」というのが私の評価である。ちなみに、
TypeMail と BlueMail (1) (2)
によると、TypeApp というメールアプリも同じ開発元で機能もほとんど同じらしい。

 

最後になったが、Zenfone3自体について一言。
約3ヶ月使用してみたが、カメラ撮りやゲームをしない私にとっては、Zenfone5に比べ処理能力の差異はそれほど実感することはなく、指紋認証が使えて便利になったこと以外は特に変わった感はないが、バッテリの持ちもまずまずで毎日ストレスなく利用している。
結局、スマホでもアプリでも、この「普通に使える」ことが一番重要な気がする。

では。

| | コメント (0) | トラックバック (0)

2017年7月17日 (月)

エクスプローラでファイル名をクリップボードにコピーする

Windowsのエクスプローラを使っていて「何でこんなこともできないんだ 」と叫びたいことが何度もあるが、その最たるものが、ファイル名のクリップボードへのコピーである。
フリーソフトを使えば何とかなるのであるが、会社のPCにはインストールできない。

コマンドプロンプトを開いて dir を叩くという手もあるがやはり面倒くさい ・・・
などなど思いながら、いろいろググってみると、ファイルなどを選択した状態で右クリックでメニューが表示されるが、Shiftを押しながら右クリックすると、現れるメニュー項目が増え、その中の「パスのコピー」を使えばフルパスの情報がクリップボードにコピーされることが判った。

以下は1フォルダと1ファイルを選択して実行した例である。

 "E:\test_folder\folder1"
 "E:\test_folder\file01.txt"

確かにこれでも悪くないのだが、自分の好み的には以下の点が不満であった。

  • パス名(上の例では E:\test_folder\folder1 )は最初に1行あればよく、あとはファイル名やフォルダ名だけの一覧の方が良い
  • 両端のダブルコーテーションはいらない

しばらくはこれで乗り切っていたのだが、やはり何とかならないかと再度ググってみたところ以下の記事を発見。

 Palm84 某所の日記 - 「送る」でファイル名をごにょごにょするバッチファイル

エクスプローラの右クリックメニューの「送る」と自作のバッチファイルを組み合わせて、フルパスやファイル名などの一覧をテキストファイルに出力する例が4種類公開されている。
仕様的に私の欲しいものとは違っているのでこのまま使わせてもらおうとは思わなかったが、『「送る」とバッチファイルの組合せで欲しいものができるのでは?』というのは大きな発見であった。

ということで、これを参考にバッチファイルの自作にチャレンジしてみた。
以前の記事「REGZAが来た ~写真と動画再生編~」でも10行程度のWindowsバッチファイルの自作にチャレンジし、その文法の謎仕様で苦戦したことを書いたが、今回もメチャクチャに苦戦し、結局都合1日(8時間)以上費やした気がする。

それでも何とか試行錯誤しながら 3種類のバッチを完成した。
 

■共通仕様や言い訳など

  1. エクスプローラ上で対象とするフォルダやファイルを選択し(複数選択可)、右クリックメニューで「送る」⇒サブメニューを選択することで実行する。
  2. 結果はクリップボードにコピーされる。
  3. 実行中はコマンドウィンドウが表示される。
  4. 内部的には 環境変数 %TEMP%フォルダに一時ファイルを作成している。(実行終了時に削除)
  5. バッチ内にはコメントは入れていないが、高々数十行なのでご容赦いただきたい。
  6. ループ処理に for文を使ったり goto文を使ったり、フォルダか否かの判断に 属性を見たり exist文を使ったり、などなど、識者から見ると謎の記述になっていると思うが、私にも謎である 。 会社でのドメイン/ファイルサーバ利用の環境下でも動作するように修正していった結果、結局この記述になってしまった ・・・

3については、表示されない方が好みの方もいると思うが、

  • 表示しないようにするのは難しい(webの情報を見てチャレンジしたがやはり一瞬表示される)
  • サブフォルダ以下も階層的にファイル情報をコピーする機能では時間がかかる場合があり、処理終了タイミングを把握するためにウィンドウ表示があった方が良い

という理由から今の仕様とした。

 

各バッチの仕様と実行例は以下の通りである。

■実行例に使ったフォルダ構成

興味半分でジャンクションやシンボリックリンクも張っているが(参考:ジャンクションを使ってみる(その1))、興味のない方は無視してもらって構わない。
ファイルサイズは、ファイル名の下1桁が1のものは 200バイト、2のものは 500バイトである。
 
【フォルダ構成】
Copy_files_001

エクスプローラとdirコマンドでは以下のように表示される。
 ※ショートカットのサイズは何故か 1131バイト、ファイルのシンボリックリンクのサイズは空白

 Copy_files_004 Copy_files_005

 
■3つのバッチの仕様と実行例

 
1.フォルダ名とファイル名をコピー

1行目にパス名、2行目以降に選択したファイルやフォルダの名前の一覧をコピーする。(フォルダ以下は見ない)
 
【実行例】 
test_folder直下の全フォルダとファイルを選択した場合、以下がクリップボードにコピーされる。

 E:\test_folder\
 folder2
 folder2_SL
 file01.txt
 file02.txt
 file11_HL.txt
 file12_SL.txt
 file21.txt - ショートカット.lnk
 folder1
 folder1_JC
 
 
2.Excel用ファイル情報をコピー

Excelにそのまま貼り付けできるよう、パス、ファイル名、サイズ、更新日時をタブ区切りでコピーする。コピー対象ファイルは、以下のとおりである。

  • 選択されている対象がフォルダ1つの時は、そのフォルダ以下の全ファイル(サブフォルダ以下も全て表示、フォルダ自体の行はなし)
  • 選択されている対象がそれ以外の場合は、選択されているフォルダとファイル(フォルダ以下は見ない)

【実行例1】 
test_folder フォルダを1つ選択した場合、以下がクリップボードにコピーされる。(そのままExcelに貼り付けた例)
 ※ジャンクションやシンボリックリンクは実際に実体があるかのように表示される

 Copy_files_007

【実行例2】
test_folder直下の全フォルダとファイルを選択した場合

 Copy_files_008

 
 
3.tree情報をコピー

選択されている対象がフォルダ1つの時のみ dosコマンドの tree文の結果をコピー、それ以外が選択されているときはエラー。

【実行例】 
test_folder フォルダを1つ選択した場合、以下がクリップボードにコピーされる。
※ジャンクションやシンボリックリンクは実際に実体があるかのように表示される
 

 フォルダー パスの一覧:  ボリューム XXXXXXXXXX
 ボリューム シリアル番号は XXXXXXXXXXXXXX です
 E:\TEST_FOLDER
 │  file01.txt
 │  file02.txt
 │  file11_HL.txt
 │  file12_SL.txt
 │  file21.txt - ショートカット.lnk
 │ 
 ├─folder1
 │      file11.txt
 │      file12.txt
 │      
 ├─folder1_JC
 │      file11.txt
 │      file12.txt
 │      
 ├─folder2
 │      file21.txt
 │      file22.txt
 │      
 └─folder2_SL
         file21.txt
         file22.txt

 
■各バッチファイルのダウンロード

以下のリンクを右クリックし、メニューから「名前を付けてリンク先を保存」や「対象をファイルに保存」などを選択しダウンロードする。(文字コードは SJISを使っているため web上で表示した場合は文字化けするので注意。)

「1_copy_filenames.bat.txt」をダウンロード

「2_copy_file_info_for_Excel.bat.txt」をダウンロード

「3_copy_tree_info.txt」をダウンロード

 
■実装手順

  1. 使いたいバッチファイルをダウンロードし、ファイル名の最後の「.txt」を削除してから保管したいフォルダに移動する。
  2. エクスプローラでパスを入れるところで「shell:sendto」と入力して、SendTo フォルダを開く。
    私の場合(Windows10 Home)は以下のフォルダである。
      C:\Users\ユーザ名\AppData\Roaming\Microsoft\Windows\SendTo
  3. 1のバッチファイルのショートカットを 2の SendToフォルダの直下に作成し、名称を判りやすいものに変更する。
    「送る」メニューは名前順に表示されるので、なるべく並んで表示されるよう、先頭の名称を合わせた方が良い。
    私の場合、以下のように「copyN:」を先頭に付けている。

 
 Copy_files_009

 
今、会社でこれらのバッチを使用しているが、なかなかいい感じだ

では。
 

【2020年5月6日追記】
 
2.Excel用ファイル情報をコピー
3.tree情報をコピー

のスクリプトに、パスに空白が含まれている場合に正しく動作しないという不具合があったので修正した。

 

【2020年5月6日追記】

VBScript で動作する改良版を作成したので興味のある方は以下の記事へ。

エクスプローラからファイル一覧を出力するVBScript(検索結果もOK)

 

| | コメント (0) | トラックバック (0)