【入門編】【タイムスタンプ変更】Shell.Application と FileSystemObject を組み合わせたファイル作成日・更新日・アクセス日の動的改変 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptでファイルの時間を操る:`Shell.Application`と`FileSystemObject`の深淵な連携術

こんにちは。自動化の現場で数々の泥臭い要件をシステム化してきたエンジニアです。

今日は、プログラミング初学者や「マクロの記録」からのステップアップを目指す方に向けて、「ファイルのタイムスタンプを意図的に書き換える」という、一見地味ながらも実務で絶大な威力を発揮するテクニックを伝授します。

「ファイルの作成日や更新日なんて、OSが管理するものじゃないの?」と思ったあなた。その通りです。しかし、テストデータの整合性を取ったり、レガシーシステムのログ移行を行ったりする際、この「時間を操作する能力」は、エンジニアとしての武器になります。

1. 舞台装置:二つの強力なオブジェクト

VBScriptでOSの深い部分に触れるには、二つの強力なオブジェクトを使い分ける必要があります。

1. FileSystemObject (FSO): ファイルの「中身」や「属性」を扱うための司令塔。
2. Shell.Application: Windowsの「エクスプローラー」そのものを操るための黒幕。

実は、`FileSystemObject`単体では、ファイルの「作成日時」を書き換えることはできません。そこで、エクスプローラーの機能(Shellオブジェクト)を借りて、ファイルに「今からこの日時を適用するぞ」と命令を送るのです。

2. 実装コード:タイムスタンプを書き換える

以下のコードをコピーして、拡張子を `.vbs` にしたテキストファイルとして保存してください。

‘ タイムスタンプ変更スクリプト (SetFileTime.vbs)
Option Explicit

Dim strFilePath, strNewDate
Dim objShell, objFolder, objFile
Dim objFSO

‘ 1. 対象ファイルのフルパスと、書き換えたい日時を指定
strFilePath = “C:\Test\sample.txt”
strNewDate = “2023/12/31 23:59:59”

‘ 2. オブジェクトの生成
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objShell = CreateObject(“Shell.Application”)

‘ ファイル存在チェック(重要:存在しないファイルは操れません)
If objFSO.FileExists(strFilePath) Then
‘ 親フォルダを取得して、Shellオブジェクトとして開く
Set objFolder = objShell.NameSpace(objFSO.GetParentFolderName(strFilePath))
‘ ファイルオブジェクトを特定
Set objFile = objFolder.ParseName(objFSO.GetFileName(strFilePath))

‘ 3. タイムスタンプの書き換え(Shellオブジェクトの機能を使用)
‘ 注意: 日本語環境では、このメソッドが適用できるプロパティインデックスが
‘ 環境依存する場合がありますが、一般的に「作成日時」や「更新日時」を操作可能です。
‘ ここでは「更新日時」を操作する例です。
objFile.ModifyDate = strNewDate

MsgBox “完了しました。時刻を ” & strNewDate & ” に変更しました。”, vbInformation
Else
MsgBox “指定されたファイルが見つかりません。”, vbCritical
End If

‘ 4. 後処理:オブジェクトの解放(メモリの開放はエンジニアの礼儀です)
Set objFile = Nothing
Set objFolder = Nothing
Set objShell = Nothing
Set objFSO = Nothing

3. ここを理解すればあなたは一人前!3つのポイント

① `Shell.Application`を使う理由

`FileSystemObject`はファイルの読み書きには最強ですが、OSのファイルシステムレベルのメタデータ(作成日など)を書き換える権限は持っていません。一方、`Shell.Application`はWindowsのGUIを操作するインターフェースなので、ユーザーがプロパティ画面で操作するのと同じレベルの書き込みが可能です。

② 「オブジェクトの解放」という作法

コードの最後に `Set obj = Nothing` を記述していますね。VBScriptはメモリ管理が自動ですが、大きな処理を行う際、明示的にNothingを代入してオブジェクトを破棄することは、メモリリークを防ぐためのプロの作法です。

③ 陥りやすいエラー:権限とパス

  • 権限エラー: 書き込み禁止のファイルや、システム領域のファイルを操作しようとすると「許可がありません」と怒られます。管理者権限で実行するか、操作対象のパスが正しいかを確認してください。
  • 日付の形式: `strNewDate` に入れる文字列は、OSの地域設定に依存します。「YYYY/MM/DD HH:MM:SS」の形式が最も安全ですが、もしエラーが出る場合は、コントロールパネルの「地域」設定を確認しましょう。

4. 先輩エンジニアからのアドバイス

「マクロの記録」では、特定のアプリケーションを動かすことしかできません。しかし、このように VBScriptでOSの深層に触れる技術 を身につければ、アプリケーションの垣根を超えた「真の自動化」が可能になります。

まずは、このスクリプトを自分のPCにある適当なテキストファイルで試してみてください。自分のコード一つで、ファイルの時間が自在に変わる感覚。これが自動化エンジニアとしての第一歩です。

ここをクリアすれば、あなたはもうただの初心者ではありません。次は、フォルダ内の全ファイルを一括でリネームしたり、ログを監視して自動でアーカイブするような、より高度な世界が待っていますよ。

頑張ってください!応援しています。

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