自分はuwscでスクリプト書いてて、gb.exeというファイルをゴミ箱に移動できるコマンドラインツールを使ってるんだが、「•」のようなANSIで表現できない記号が含まれていると、ゴミ箱へ移動できないようだった。
というわけで、UTF-8(?)で取り扱われてるっぽい文字列をANSIに変換して、問題ないファイル名を作る関数を作ってみた。
//ANSIで表現できない特殊な記号が含まれていたら、str_repに置換された文字列を返す。 //また、ファイル名に使用できない文字列が含まれていたらそれもstr_repに置換する。 function CreateSafeFileName(strFileName,str_rep="_") dim tmp=ENCODE(strFileName, CODE_ANSI) result=RemoveProhibitionCharcterforFileName(tmp,str_rep) fend // ファイル名に使えない、下記文字列をstr_repに置換した文字列を返す。 // \ / ? : * " > < | function RemoveProhibitionCharcterforFileName(strFileName,str_rep="") result=ReplaceMatchWord(strFileName,"[\\/\?:\*<#DBL>><\|]",str_rep,true,true) fend //strSearchedの中で、正規表現strPatternと一致した部分を、str_replaceToに置換 //置換完了した文字列を返す。 function ReplaceMatchWord(strSearched,strPattern,str_replaceTo,flagGloval=true,flagIgnoreCase=true) dim re=CreateOleObj("VBScript.RegExp") re.pattern = strPattern //正規表現パターン。 re.Global = flagGloval //文字列全体を検索。trueでする(規定)、falseでしない(マッチしたらそこで終了)。 re.IgnoreCase = flagIgnoreCase //大文字・小文字を区別。trueでしない(規定)、falseでする。 result = re.Replace(strSearched,str_replaceTo) re=null fend
この、CreateSafeFileNameにファイル名として使いたい文字列を入れると、ファイル名に使えない文字列をstr_repに置換した文字列にしてくれる。やってる内容は、ENCODEでANSIに変換して、変換できなかった特殊な文字は「?」になるから、ファイル名禁止文字列の置換でまとめて置換しちゃってる。
取り合えず、FileSystemObjectで取得したファイルオブジェクトを、これで作ったファイル名にリネームすれば問題なく動くように出来た。
コメント