htsign's blog

ノンジャンルで書くつもりだけど技術系が多いんじゃないかと思います

他の人がエントリに書いてた仕分けbatが冗長だったのでvbsにした

www.ken10blog.com

本当はC#とかでパパッと書いてしまうのが楽だけど、元ネタがバッチファイルなのでWindows標準で動くスクリプトという点でWSHを選びました。*1
PowerShellはローカルで気軽に動かすためにポリシーを変更する必要があるので却下。

Option Explicit

Const ForWriting = 2
Const TristateFalse = 0

Dim wsh, fso
Set wsh = WScript.CreateObject("WScript.Shell")
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
wsh.CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName)

Dim logfile, folder, file
Set logfile = fso.OpenTextFile("imageFiltering.log", ForWriting, True, TristateFalse)
Set folder  = fso.GetFolder(wsh.CurrentDirectory)

For Each file In folder.Files
    Dim name, index
    name = file.Name
    index = InStrRev(name, ".")
    
    If index > 0 Then
        Dim ext
        ext = Mid(name, index + 1)
        
        Select Case LCase(ext)
            Case "jpg", "jpeg", "gif", "png"
                Call Move(name)
        End Select
    End If
Next

Function Move(filename)
    Dim re, ms, m
    Set re = New RegExp
    re.Pattern = "モデル\:([^]]+)"
    
    Set ms = re.Execute(filename)
    For Each m In ms
        Dim matched, models, model
        matched = m.SubMatches(0)
        models = Split(matched)
        
        For Each model In models
            If Not fso.FolderExists(model) Then
                fso.CreateFolder model
            End If
            
            logfile.WriteLine "【" & filename & "】を【" & model & "】フォルダにコピー"
            fso.CopyFile filename, fso.BuildPath(model, filename)
        Next
        
        logfile.WriteLine "【" & filename & "】を削除"
        fso.DeleteFile filename
    Next
    
    Set ms = Nothing
    Set re = Nothing
End Function


logfile.Close
Set logfile = Nothing
Set folder  = Nothing
Set fso     = Nothing
Set wsh     = Nothing

スクリプトShift-JISで保存しないと正規表現エンジンが正しく動作しません。
あと例外処理とかなにもしてないのでその辺はよしなに。

書いてる途中でいっそファイルのダウンロードも自動化しようかとも思ったけどめんどくさいのでやめました。

*1:実はC#コンパイラであるcsc.exeはWindowsシステムフォルダの奥深くに初めから入っていますが、それはまた別のお話。