【VBScript】ファイルをコピーする方法を調べてみた

VBScript
スポンサーリンク

こんにちは朱夏です。

今回は、ファイルコピーについて調べてみました。
データのバックアップなどでファイルをコピーする事は頻繁に発生するので、ここを自動化出来たらだいぶ楽になります。

それではいってみましょう。

 

[もくじ]
ファイルコピーの書き方
今回発生したエラー
上書きしたくない時の対処法
あとがき

 

ファイルコピーの書き方

調べてみたところ、ファイルコピーは以下の様に書くようです。

'ファイルコピーで使う変数宣言
Dim objFileCopy
Dim strFileCopyFrom
Dim strFileCopyTo

'ファイルシステムオブジェクト
Set objFileCopy = CreateObject("Scripting.FileSystemObject")
'コピー元ファイルのパス
strFileCopyFrom = "F:\vbs学習\20200518\log\dummy.log"
'コピー先フォルダのパス
strFileCopyTo = "F:\vbs学習\20200518\backup\"

'ファイルコピー処理
Call objFileCopy.CopyFile(strFileCopyFrom, strFileCopyTo, True)

msgbox "コピーが完了しました"

 

ポイントになるのは、ファイルコピー処理の部分です。

Call objFileCopy.CopyFileファイルコピー(strFileCopyFromコピー元ファイル, strFileCopyToコピー先フォルダ, True上書き)

 

初めに、ファイルシステムオブジェクトでファイルコピーする事を指定します。
次に、3つの引数を指定します。

  1. コピー元のパス
  2. コピー先のパス
  3. 同名のファイルが存在した場合の処理

 

3つ目の「同名のファイルが存在した場合の処理」は、TrueかFalseを指定できます。
それぞれ処理が以下の様に分かれます。

True:上書き(省略可能)
False:エラーを発生させる

 

 

今回発生したエラー

今回の学習で発生したエラーは以下です。

 

エラー:書き込みできません。
コード:800A0046
ソース:Microsoft VBScript 実行時エラー

 

上記情報で調べてみたところ、実行権限などにより、ファイルの編集が出来ない場合に発生するエラーの様です。

朱夏
朱夏

コピーしたいだけなのに何故…(´・ω・`)。

想定外のエラーに困惑しつつ、以下のキーワードでGoogle検索してみたら、情報を発見しました。

検索キーワード:VBScript ファイルコピー 800A0046

 

解決のヒントになった情報はこちらの質問サイトでした。

No.2ベストアンサー

回答者: BLUEPIXY 回答日時:2005/11/10 23:00
CopyFile メソッドは、
コピー元に*が指定された場合コピー先をフォルダとして扱います。
また、コピー先フォルダが¥で終わっているときフォルダとしてあつかいます。
逆に言うと、*が指定されていない場合で、コピー先フォルダ名として¥で終わっていない場合、ファイルからファイルとしてコピーをするということです。
つまり、ファイル名が指定されたとしてコピーしようとするが、実際にはフォルダ名であるので、エラーになっているというようなことかと思います。

※参考サイトより抜粋

 

コピー元、コピー先のパス指定をいじればなんとかなりそうだという事を発見。
早速調べてみたところ、エラー発生当初はコピー先フォルダのパスを以下の様に指定していました。

strFileCopyTo = “F:\vbs学習\20200518\backup”

 

パスの最後の部分を、”~\backup”から、”~\backup\”に変更したらエラーが出なくなりました。
フォルダをファイルとして処理しようとしてて、エラーが発生していたんですね。

エラーメッセージの内容がそのままの意味で使えるとは限らないのは、よくある事みたいです(;・∀・)

 

上書きしたくない時の対処法

基本的な書き方では、コピーしてきたファイルがコピー先に存在していた場合、上書きしてしまいました。

朱夏
朱夏

記録として取り貯めておきたいから上書きされたら困る。

 

こんな事を考えていたので、上書きせずにコピーしたいときの対処方法を調べました。
たどり着いた方法は以下。

コピーしたファイルをユニークな名前にリネームしてコピー先に格納する事

 

 

調べてみましたが、出てくる情報はファイルコピーの3つ目の引数(同名のファイルが存在した場合の処理)をFalseにして、発生したエラーを表示させるだけで終了する様なものばかりでした。

エラーを表示して止まるだけじゃなく、ファイル名を変更して保存できないものか…
そもそも、最初からファイル名が被らない様にコピー出来たらベストだなと考えました。

 

因みに、ファイルコピーの3つ目の引数をFalseに変更した場合、既に同名のファイルが存在すると以下の様なエラーが表示されます。

 

 

作成したサンプルコードはこちらになります。

'ファイルコピーで使う変数宣言
Dim objFileCopy
Dim strFileCopyFrom
Dim strFileCopyTo
Dim strFileNameDate

'ファイルリネーム用のタイムスタンプデータ作成
strFileNameDate = Date() & "_"
strFileNameDate = Replace(strFileNameDate, "/", "")
strFileNameDate = strFileNameDate & Right("0" & Hour(Now()) , 2)
strFileNameDate = strFileNameDate & Right("0" & Minute(Now()) , 2)
strFileNameDate = strFileNameDate & Right("0" & Second(Now()) , 2)

'ファイルシステムオブジェクト
Set objFileCopy = CreateObject("Scripting.FileSystemObject")
'コピー元ファイル
strFileCopyFrom = "F:\vbs学習\20200518\log\dummy.log"
'コピー先フォルダ
strFileCopyTo = "F:\vbs学習\20200518\backup\dummy_" & strFileNameDate & ".log"

'ファイルコピー処理
Call objFileCopy.CopyFile(strFileCopyFrom, strFileCopyTo, false)

msgbox "コピーが完了しました。"

 

ポイントは以下にまとめました。

  • ファイル名に付与するタイムスタンプ作成
    • Replace()
    • Right()

 

それぞれについて解説します。

Replace()

テキストの置換をしてくれる関数です。
(~)内に入る引数は以下の様になります。

Replace(strFileNameDate置換対象, “/検索文字列“, “ 置換文字列“)

 

今回のサンプルでは、置換対象の変数に対して、”/(スラッシュ)”を”(何もなし)”に変換しています。
こうすると、スラッシュを消すことが出来ます。

 

Right()

テキストの右から指定された文字数分だけ取り出すことが出来る関数です。
今回のサンプルで説明するとこんな感じ。

Right(“0” & Hour(Now())対象テキスト , 2取得文字数)

 

引数は以下の2つです。

    • 対象テキスト
    • 取得文字数

 

対象テキストは時間の頭に0を付けたものです。
取得文字数は右から2文字を取得しました。

何をやっているかというと・・・時間をHHMMSS形式に変更する処理です。
時間データをそのまま取得した場合、以下の様なパターンが発生したため、必要になりました。

取得時間:8:31:56
欲しい情報:08:31:56

 

Right()関数を使った場合、以下の様な動きになるので、常に2桁で時間を取得できるようになりました。

例1:8:31:56の場合
0の後ろに時間(hour)の8を接続します。
出来上がった文字列「08」の後ろ2桁を取得します。例2:20:31:56の場合
0の後ろに時間(hour)の20を接続します。
出来上がった文字列「020」の後ろ2桁を取得します。

 

分、秒についても同じ処理をしておきました。
これで常に同じ桁数でタイムスタンプをファイル名に付与する事が出来ます。

 

あとがき

というわけで、今回はファイルのコピー方法について学習してみました。

今回のまとめはこちら。

  • CopyFile(コピー元, コピー先, 上書き時の処理)で書く
  • 上書きする場合は3つ目の引数を省略できる
  • コピー先のフォルダを指定したい場合は\で終わる

 

今回は具体的にログのバックアップを取得する方法にフォーカスして学習してみました。
実戦ですぐ使える内容の方が学習がはかどるかもしれません。

今回は以上です。
次回もよろしくお願いします。

 

タイトルとURLをコピーしました