1.使うメソッド
object.MoveFile ( source, destination );
引数
object
必ず指定します。FileSystemObject オブジェクトの名前を指定します。
source
必ず指定します。移動するファイルのパスを指定します。パスの最後の構成要素内ではワイルドカード文字を使用できます。
destination
必ず指定します。ファイルの移動先のパスを指定します。ワイルドカード文字は使用できません。
解説
引数 source にワイルドカード文字を使用したとき、および引数 destination がパスの区切り文字 () で終わるとき、引数 destination には既存フォルダを指定したと判断され、条件に一致するファイルがそのフォルダ内へ移動されます。それ以外のときは、引数 destination には作成するファイルの名前を指定したと判断されます。いずれの場合も、移動される各ファイルで発生する処理の実行は 3 種類あります。
引数 destination に指定したファイルが存在しない場合、ファイルが移動します。これが通常の場合です。
引数 destination に指定したファイルが存在する場合、エラーが発生します。
引数 destination がディレクトリの場合、エラーが発生します。
引数 source でワイルドカード文字を使用した指定がどのファイルとも一致しなかった場合も、エラーが発生します。MoveFile メソッドは、最初のエラーが発生した時点で処理を中止します。エラーが発生するまでに行った処理を取り消したり元に戻したりする処理は一切行われません。
メモ
このメソッドを使用してボリューム間でファイルを移動できるのは、オペレーティング システムでボリューム間のファイル移動がサポートされている場合だけです。
2.公式が教えてくれないこと その1
MoveFileメソッドがファイル名の変更と書いていないこと。
実際上記の公式の解説をファイルの移動以外に理解することは困難だ。
Windows管理者のためのWindows Script Host入門:第10回 WSHスクリプトからのファイル操作(1)(2/3)
CopyFileメソッドと同じように、移動先にはファイル名ではなくフォルダ名を指定することができる。また、移動するファイルをワイルドカードで指定することも可能だ。移動先にすでにファイルがあった場合、CopyFileメソッドとは異なり、常にエラーが発生する。エラーを発生させずに、既存ファイルを上書きするには、あらかじめ移動先のファイルを削除しておくか、移動ではなくコピーした後で元のファイルを削除するようにする。
ファイル名を変更したい場合にもMoveFileメソッドが利用できる。具体的には、移動先として、元と同じフォルダ内の新しいファイル名を指定することでファイル名を変更できる。
3.公式が教えてくれないこと その2
destinationとsourceはデータ型が決まっている
これはString(文字列)で、これ以外は実はエラーになります。
このためVBscriptでは変更前のファイル名のフルパスと変更後のファイル名のフルパス用の変数を用意し
'Same Name zip File name change
If fs.FileExists(objDocFol.Path & "\E.zip") Then
dt = fs.GetFile(objDocFol.Path & "\E.zip").DateLastModified
strOldfile = CStr(objDocFol.Path & "\E.zip") 'you must change String Datatype
strNewfile = CStr(objDocFol.Path & "\E" & Replace(Replace(Replace(dt, "/", "", 1, -1), ":", "", 1, -1), " ", "", 1, -1) & ".zip")
fs.MoveFile strOldfile, strNewfile 'Change filename with fso is Movefile method
End If
このようにCStr() で文字列型に変換して変数に代入します。
こうしなくても動く場合がありますが、たまにエラーで動かなくなります。
なので、かならず文字列型にした方が無難です。
4.公式が教えてくれないこと その3
ファイルをオブジェクトとして変数には代入していないこと
変更したいファイルを
Set tgFile =Fso.getfile(ファイル名)
としていると変数に代入しているので変更できません。
変更する前に set tgfile = NothingのようにNothingで解放する必要があります。
ファイスサイズが重いときはWscript.Sleepをいれた方が良い時もあります。
5.公式が教えてくれないこと その4
ファイル名にはユニコード文字を使わない方が良いこと
代表的なものは〇つき数字です。
まずVBScriptないでユニコード文字を扱うとファイル形式がANSI形式のテキストファイルになりません。こうなるとVBEにする暗号化はできません。
次にDir命令でテキストにファイル名を出力しても文字化けします。
一応扱えないことはないのですが、そういう細かい欠点があり、使わない方がバグが起きません。
公式がFSOの解説を作ったときはユニコードが一般的ではなかったので、こうしたことが書いていないのだと思われます。