ファイル名に特殊記号が含まれていて操作できない。

自分は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で取得したファイルオブジェクトを、これで作ったファイル名にリネームすれば問題なく動くように出来た。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です