Dirコマンドの取得結果を整理するVBScript
2021年08月31日
Dirコマンドの取得結果をdir /s /b風に整理するVBScript
元々、Dirコマンドを使ってフォルダ内のファイル一覧を取得して、
エクセルを使って解析していたんだけど、
何をするにもエクセルでマクロを動かしてからだと使い勝手も悪いし、
他のエクセルを使った業務ができなくなるので
VBScriptに外だしすることにした。
エクセルバージョンはこちら
https://aki.p-kin.net/Entry/10/
※ 不具合修正。環境によってファイルサイズの末尾に「バイト」が付く場合があるので、
fSize = Trim(Replace(Mid(buf, 19, 16),"バイト",""))とするのが良いかも。
おさらい
コマンドプロンプトで以下コマンドを打つと、フォルダ内のファイル一覧を取得できる。
> Dir フォルダ名
このコマンドのよく使うオプションはこちら
/s:サブフォルダを対象にする
/a-d:ファイルのみを対象にする
/b :フルパスのファイル名のみ取得する
> ファイル名:指定したファイルに結果を上書きする
>> ファイル名:指定したファイルに結果をアペンドする
/b形式は加工しやすいけど、ファイルのサイズや更新日時を取りたい。。。
というわけで、「Dir /s /a-d フォルダ名 > ファイル名 」のコマンドで取得して、
ドラッグドロップすると/b形式に変換するVBScript。
それにしても、VBScriptはデバッグしにくいなー。
ソースの中身をテキストファイルにコピペして、.VBSの拡張子で保存。
Dir /s /a-dの結果をドラッグドロップすると、/bっぽく整理して出力。
ファイルサイズの出力等の設定をオプション定数に出した。
以下、ソース。
元々、Dirコマンドを使ってフォルダ内のファイル一覧を取得して、
エクセルを使って解析していたんだけど、
何をするにもエクセルでマクロを動かしてからだと使い勝手も悪いし、
他のエクセルを使った業務ができなくなるので
VBScriptに外だしすることにした。
エクセルバージョンはこちら
https://aki.p-kin.net/Entry/10/
※ 不具合修正。環境によってファイルサイズの末尾に「バイト」が付く場合があるので、
fSize = Trim(Replace(Mid(buf, 19, 16),"バイト",""))とするのが良いかも。
おさらい
コマンドプロンプトで以下コマンドを打つと、フォルダ内のファイル一覧を取得できる。
> Dir フォルダ名
このコマンドのよく使うオプションはこちら
/s:サブフォルダを対象にする
/a-d:ファイルのみを対象にする
/b :フルパスのファイル名のみ取得する
> ファイル名:指定したファイルに結果を上書きする
>> ファイル名:指定したファイルに結果をアペンドする
/b形式は加工しやすいけど、ファイルのサイズや更新日時を取りたい。。。
というわけで、「Dir /s /a-d フォルダ名 > ファイル名 」のコマンドで取得して、
ドラッグドロップすると/b形式に変換するVBScript。
それにしても、VBScriptはデバッグしにくいなー。
ソースの中身をテキストファイルにコピペして、.VBSの拡張子で保存。
Dir /s /a-dの結果をドラッグドロップすると、/bっぽく整理して出力。
ファイルサイズの出力等の設定をオプション定数に出した。
以下、ソース。
Option Explicit
Const FulNameOnly = 0 'オプション 0:フォルダ名、ファイル名、ファイルサイズ、更新日時を出力 1:フルパスファイル名のみ
'ドラッグドロップでファイルを印刷するスクリプト
'http://chuckischarles.hatenablog.com/entry/2018/10/29/002921
'-------------------------------------------------------------------------------------------------------
' 引数が無かった時の処理
If WScript.Arguments.count = 0 then
WScript.Echo "引数が無いため、実行できません。" & vbNewLine & _
"ファイルをドロップしてください。"
WScript.Quit
End If
'確認
' if msgbox("更新日時でリネームします。よろしいでしょうか?",vbyesno) = vbno then
' WScript.Quit
' end if
dim targetPath,FilePath
dim FSO
'----------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクト作成
Set FSO = CreateObject("Scripting.FileSystemObject")
'-------------------------------------------------------------------------------------------------------
' フォルダ内ファイルリスト出力
for each targetPath In WScript.Arguments
'----------------------------------------------------------------------------------------------------
' ドロップされた引数がフォルダかファイルかを判定する
If FSO.FolderExists(targetPath) then
' is folder.
WScript.Echo "フォルダがドロップされました。" & vbNewLine & _
"処理を終了します。"
WScript.Quit
ElseIf FSO.FileExists(targetPath) then
' is file.
else
' is unknown.
WScript.Echo "フォルダ 及び ファイル とも認識できないデータがドロップされました。" & vbNewLine & _
"処理を終了します。"
WScript.Quit
End If
' メインモジュール呼び出し
Call ChangeFormatMain(targetPath)
Next
set FSO = nothing
'-----------------------------------------------------------実質ここから
'------------------------------
' メイン処理
'------------------------------
Sub ChangeFormatMain(targetPath)
const strCode = "Shift-Jis" ' 文字コード指定 "Shift-Jis" "UTF-8"
Dim input: Set input = CreateObject("ADODB.Stream")
input.Type = 2 ' 1:バイナリ・2:テキスト
input.Charset = strCode ' 文字コード指定
input.Open ' Stream オブジェクトを開く
input.LoadFromFile targetPath ' ファイルを読み込む
Dim StrText,buf,Ext,Path,strDate,fSize,fname
Dim Dic: Set Dic = CreateObject("Scripting.Dictionary")
Dim dirDic: Set dirDic = CreateObject("Scripting.Dictionary")
Do Until input.EOS 'https://qiita.com/5zm/items/a8ba71d47d161b52c823
buf = input.ReadText(-2) ' -1:全行読み込み・-2:一行読み込み
If Right(buf, Len("のディレクトリ")) = "のディレクトリ" Then
Path = Trim(Replace(buf, "のディレクトリ", ""))
ElseIf Mid(buf, 5, 1) = "/" And Mid(buf, 8, 1) = "/" Then
strDate = Replace(Trim(Mid(buf, 1, 17)), " ", " ")
fSize = Trim(Replace(Mid(buf, 19, 17),"バイト",""))
fname = Trim(Mid(buf, 37, Len(buf) - 37 + 1))
Ext = getExt(fname)
If fname <> "." And fname <> ".." Then
Dic.Add Path & "\" & fname, getFileName(Path) & "‡" & fname & "‡" & strDate & "‡" & fSize & "‡" & Ext
End If
ElseIf Right(buf, 3) = "バイト" Then
'dirDic.Add Path, buf
End If
Loop
' Stream を閉じる
input.Close
Dim keys: keys = Dic.keys
Dim Items: Items = Dic.Items
Set Dic = Nothing
Dim oBuf, i , j , fCnt , dSize , strItem
For i = 0 To UBound(keys)
oBuf = Split(Items(i), "‡")
If oBuf(3) <> "
PR
Comment