はじめに
VBScript(以下VBS)は、Windowsランタイム等のインストールなしに実行できるスクリプト言語ですが、今回は基本文法を習得済みの方に向け、ファイル操作を中心に少し進んだ内容を学習していきます。Windowsに関する多彩な操作が可能となっていますので、効率アップに役立ててみてください。
→ VBScript 基礎編
また、極力説明を簡略化するために、ファイル操作ではエラー処理を省いています。必要に応じてファイルの存在確認やコピーの同意確認等を実施するようにしてください。
レッスン1.実行方法について
VBSを実行する方法は、大きく2つあります。この章では、それぞれの実行方法を説明していきます。
ダブルクリックで実行
まずは、一般的なWindowsアプリケーションのように、マウスでアイコンをダブルクリックして実行する方法です。下記のコードを「test.vbs」として保存します。
Option Explicit msgbox "スクリプトが実行されました"
ファイルを保存したら、アイコンをダブルクリックしてみましょう。下記のメッセージが表示されたら成功です。
batファイルから実行
次にbatファイルから呼び出す方法です。先ほど作った「test.bat」を呼び出すコマンドを作ってみましょう。
下記のbatファイルを「test.vbs」と同じディレクトリに作成し、ファイル名は「call.bat」とします。
cscript test.vbs
作成できたら、「call.bat」をダブルクリックして実行してみます。コマンドプロンプトウィンドウが表示され、先ほど同様にMsgboxが表示されれば成功です。
この方法は、ほかのアプリケーションと連携させる時などに便利ですので、覚えておきましょう。また、実行する際に、引数をとることもできます。
では、実際に試してみましょう。vbsファイルとbatファイルのコードをそれぞれ書き換えてみます。
test.vbs
Option Explicit Dim args args = Wscript.Arguments(0) msgbox args
call.bat
cscript test.vbs "Hello VBS"
「call.bat」で.vbsファイルに引数として与えた文字列を、VBS側でMsgboxに表示するプログラムです。コードができたら保存して「call.bat」を再度実行してみましょう。
尚、引数は複数与えることもできます。複数の引数を取りたい場合は、Wscript.Argumentsの配列に格納されますので、要素番号を増やすことで対応できます。
例)arg2 = Wscript.Arguments(1)
レッスン2.ファイル操作
ここではWindows上でのファイル操作について学習していきます。簡単なファイル操作であれば、batファイルでも可能なのですが、より分かりやすいコードかつ、規則的なリネームなどの複雑な処理にも対応しているという点でVBSに分があります。
では、早速ファイルの基本操作からスタートします。
ファイル作成
ファイル操作を行う場合、CreateObjectという関数を使ってファイルシステムのオブジェクトを作成する必要があります。これはおまじないのように記載してもらえば良いです。
では、それを踏まえてサンプルコードを見てみましょう。新規テキストファイルに文字列を書き込むサンプルです。
コード:
Option Explicit Dim fileSysObj 'ファイルシステムオブジェクトの生成 Set fileSysObj = CreateObject("Scripting.FileSystemObject") Dim textFileObj 'テキストファイルオブジェクトの生成 Set textFileObj = fileSysObj.CreateTextFile("test.txt", true) '文字列書き込む textFileObj.Write("Line1"+vbCrLf+"Line2") 'ファイルを閉じる textFileObj.Close
実行すると、「test.vbs」と同じディレクトリにテキストファイルができますので、開いてみましょう。
ファイルができていることを確認出来たら成功です。ファイル操作の際には、最後にファイルを閉じることを忘れないでください。忘れると、バックグラウンドで開きっぱなしになってしまいますので、ご注意ください。
ファイルコピー
続いてファイルのコピーです。ファイルのコピー先の名前を別指定することで、ファイル名の変更を行うこともできます。
先ほどのコードに少し変更を加えて、作成したファイルをコピーするコードにしてみましょう。
コード:
Option Explicit Dim fileSysObj 'ファイルシステムオブジェクトの生成 Set fileSysObj = CreateObject("Scripting.FileSystemObject") Dim textFileObj 'テキストファイルオブジェクトの生成 Set textFileObj = fileSysObj.CreateTextFile("test.txt", true) '文字列書き込む textFileObj.Write("Line1"+vbCrLf+"Line2") 'ファイル名を変更してコピー Call fileSysObj.CopyFile("test.txt", "test_copy.txt") 'ファイルを閉じる textFileObj.Close
同じディレクトリに、「test_copy.txt」というファイルが出来たら成功です。コピーなので、中身は「test.txt」と同じになっているかと思います。
ファイル削除
続いてファイルを削除する方法を見ていきましょう。
コード:
Option Explicit Dim fileSysObj 'ファイルシステムオブジェクトの生成 Set fileSysObj = CreateObject("Scripting.FileSystemObject") Dim textFileObj 'テキストファイルオブジェクトの生成 Set textFileObj = fileSysObj.CreateTextFile("test.txt", true) '文字列書き込む textFileObj.Write("Line1"+vbCrLf+"Line2") 'ファイルを上書きコピー Call fileSysObj.CopyFile("test.txt", "test_copy.txt") 'ファイルを閉じる textFileObj.Close 'ファイルを削除 fileSysObj.DeleteFile "test.txt",True
ファイルをコピーした後に、コピー元のファイルを抹消しています。注意としては同じスクリプト内でファイルを開いた場合、ファイルの削除はファイルを閉じてから実行しないと、実行エラーになります。
実行して、「test_copy.txt」だけが残れば成功です。
ファイルの存在確認
ここでは指定したファイルが存在するかを確認する方法を見ていきます。ファイル操作では存在確認したうえで処理を実行するかどうかを決めることでエラーを防ぎつつ、不要な処理を省くこともできますので、効率が良いプログラムを作ることができます。
コード:
Option Explicit Dim fileSysObj 'ファイルシステムオブジェクトの生成 Set fileSysObj = CreateObject("Scripting.FileSystemObject") Dim textFileObj 'テキストファイルオブジェクトの生成 Set textFileObj = fileSysObj.CreateTextFile("test.txt", true) '文字列書き込む textFileObj.Write("Line1"+vbCrLf+"Line2") 'ファイルを上書きコピー Call fileSysObj.CopyFile("test.txt", "test_copy.txt") 'ファイルを閉じる textFileObj.Close 'ファイルを削除 fileSysObj.DeleteFile "test.txt",True 'ファイルの存在確認 if fileSysObj.FileExists("test.txt") = true then MsgBox "text.txtは存在します" else MsgBox "text.txtは存在しません" end if
コードができたら、実行してみましょう。また、ファイル削除の行を消して結果が変わることも確認してみましょう。
FileExits関数はファイルが存在する場合True、無い場合はFalseを返すようになっています。一方、ディレクトリの存在確認をしたい場合にはFolderExistsを使います。
レッスン3.ファイル名の取り扱い
VBSにはファイル名を扱う関数も豊富に準備されています。ここでは、それらをいくつか紹介します。
ファイルパスからファイル名だけを取り出す
ファイル名に連番を入れるなど規則的に変更したい際に、フルパスからファイル名だけを取り出す必要があります。そのような場合には、下記のようにします。
コード:
Option Explicit Dim fileSysObj 'ファイルシステムオブジェクトの生成 Set fileSysObj = CreateObject("Scripting.FileSystemObject") 'メモ帳の実行ファイルの場所を入れてみる MsgBox fileSysObj.GetFileName("C:\WINDOWS\system32\notepad.exe")
実行結果
ファイル名だけが取り出せました。拡張子を除く場合は
fileSysObj.GetBaseName("C:\WINDOWS\system32\notepad.exe")
と変えることで取り出せます。
逆に拡張子だけを取り出したい場合は、
fileSysObj.GetExtensionName("C:\WINDOWS\system32\notepad.exe")
とすることで取り出せます。
ファイル名を生成する
先ほどの内容を踏まえて、ファイル名をカスタマイズするコードを書いてみましょう。「notepad.exe」を「notepad_test.exe」にする例を紹介します。実際にファイル名は変更せず、MsgBoxで変更後の名前を確認するようにしています。
コード
Option Explicit Dim fileSysObj 'ファイルシステムオブジェクトの生成 Set fileSysObj = CreateObject("Scripting.FileSystemObject") 'メモ帳の実行ファイルの場所 Dim fileName fileName = "C:\WINDOWS\system32\notepad.exe" 'ファイル名を作成して表示( & 記号で文字列同士を結合できる) MsgBox fileSysObj.GetBaseName(fileName) & "_test." & fileSysObj.GetExtensionName(fileName)
実行結果:
文字列同士は&記号で結合ができます。&記号の前後には半角スペースを入れるようにしてください。このように、ファイル操作関数を駆使すると、簡単にファイル名の生成ができます。これを活用すれば、ログファイルをコピーして日付を付けておくといった類の自動化スクリプトを作ることができます。
おわりに
今回はVBSを使ったファイル操作を中心に学びました。自動化スクリプトは定型作業では効率アップに大きく貢献します。チームに配布したり、リポジトリ内に入れたりしておくスクリプトとして作成する場合にも、Windows環境であればそのまま実行できるので、使い勝手が良いです。Excel VBAをお使いの方は、ほぼ同じ文法で組むことができるVBSというものもあるということを知っていただき、Excelがインストールされていない環境でも実行できるスクリプトとして活躍することを覚えておいていただくと良いと思います。最後までお読みいただきありがとうございました。
No Comments