VBScriptさんま屋.

VBScriptの個人的なメモです (´・ω・`)

ファイル名、パス名を取得する

概要

ファイル名、パス名を取得する方法。

FileSystemObjectのパス関係のメソッド

メソッド 説明
GetAbsolutePathName フルパスを返す
GetBaseName 拡張子を除いたファイル名を返す
GetExtensionName 拡張子を返す
GetFileName ファイル名を返す
GetDriveName ドライブ名を返す
GetParentFolderName 親フォルダ名を返す
BuildPath 文字列をつないでパスを返す
GetSpecialFolder 特殊フォルダのパスを返す

指定したファイルのファイル名やパスを取得する

以下のスクリプトファイルは、テキストファイルtest.txtと一緒にC:\Scriptフォルダ内に置いてあるとする。

Dim fso, path
Set fso = CreateObject("Scripting.FileSystemObject")

'フルパスで指定した場合
path = "C:¥Script¥test.txt"
Msgbox fso.GetAbsolutePathName(path) 'C:¥Script¥test.txt
Msgbox fso.GetBaseName(path)         'test
Msgbox fso.GetExtensionName(path)    'txt
Msgbox fso.GetFileName(path)         'test.txt
Msgbox fso.GetDriveName(path)        'C:
Msgbox fso.GetParentFolderName(path) 'C:¥Script

'ファイル名で指定した場合
path = "test.txt"
Msgbox fso.GetAbsolutePathName(path) 'C:¥Script¥test.txt
Msgbox fso.GetBaseName(path)         'test
Msgbox fso.GetExtensionName(path)    'txt
Msgbox fso.GetFileName(path)         'test.txt
Msgbox fso.GetDriveName(path)        '
Msgbox fso.GetParentFolderName(path) '

'長さ0の文字列で指定した場合
path = ""
Msgbox fso.GetAbsolutePathName(path) 'C:¥Script
Msgbox fso.GetBaseName(path)         '
Msgbox fso.GetExtensionName(path)    '
Msgbox fso.GetFileName(path)         '
Msgbox fso.GetDriveName(path)        '
Msgbox fso.GetParentFolderName(path) '

'現在の作業フォルダで指定した場合
path = "."
Msgbox fso.GetAbsolutePathName(path) 'C:¥Script
Msgbox fso.GetBaseName(path)         '
Msgbox fso.GetExtensionName(path)    '
Msgbox fso.GetFileName(path)         '.
Msgbox fso.GetDriveName(path)        '
Msgbox fso.GetParentFolderName(path) '

'現在の作業フォルダの親フォルダで指定した場合
path = ".."
Msgbox fso.GetAbsolutePathName(path) 'C:¥
Msgbox fso.GetBaseName(path)         '.
Msgbox fso.GetExtensionName(path)    '
Msgbox fso.GetFileName(path)         '..
Msgbox fso.GetDriveName(path)        '
Msgbox fso.GetParentFolderName(path) '

引数のファイルが実在しなくてもエラーは発生せず値は返ってくる。

BuildPathメソッド

2つの引数を適宜\を補足してつないだパスを返す。

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

Msgbox fso.BuildPath("C:\Script", "test.txt")   'C:\Script\test.txt
Msgbox fso.BuildPath("C:\Script\", "test.txt")  'C:\Script\test.txt
Msgbox fso.BuildPath("C:\Script", "\test.txt")  'C:\Script\test.txt
Msgbox fso.BuildPath("C:\Script\", "\test.txt") 'C:\Script\test.txt
Msgbox fso.BuildPath("C:\Script\test.txt", "new.txt") 'C:\Script\test.txt\new.txt
Msgbox fso.BuildPath("C:", "test.txt")          'C:test.txt
Msgbox fso.BuildPath("C:\", "test.txt")         'C:\test.txt

ただし下から2番目の場合は\を補足してくれない。

GetSpecialFolderメソッド

特殊フォルダを取得できる。

引数 説明
0 Windowsフォルダ
1 システムフォルダ
2 Tempフォルダ

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")

Msgbox fso.GetSpecialFolder(0) 'C:\Windows
Msgbox fso.GetSpecialFolder(1) 'C:\Windows\System32
Msgbox fso.GetSpecialFolder(2) 'C:\Users\ログインユーザ\AppData\Local\Temp

上記のGetSpecialFolderメソッドで取得できるのはフォルダオブジェクトだが、Msgboxに渡されるとパス(デフォルトプロパティ)が表示される。

WshShellオブジェクトのSpecialFoldersプロパティ

SpecialFoldersコレクションを取得し、特殊フォルダのパスを取得できる。

Dim col
Set col = CreateObject("WScript.Shell").SpecialFolders

Msgbox col(0)                 'C:\Users\Public\Desktop
Msgbox col("AllUsersDesktop") 'C:\Users\Public\Desktop

取得できるパス一覧

数値 指定名 説明
0 AllUsersDesktop 全ユーザ共通のデスクトップ
1 AllUsersStartMenu 全ユーザ共通のスタートメニュー
2 AllUsersPrograms 全ユーザ共通のスタートメニューのプログラムフォルダ
3 AllUsersStartup 全ユーザ共通のスタートアップフォルダ
4 Desktop デスクトップ
5 AppData アプリケーションデータ
6 PrintHood プリンタ
7 Templates テンプレート
8 Fonts フォント
9 NetHood ネットワーク
10 Desktop デスクトップ
11 StartMenu スタートメニュー
12 SendTo 送るフォルダ
13 Recent 最近使ったファイル
14 Startup スタートアップフォルダ
15 Favorites お気に入り
16 MyDocuments マイドキュメント
17 Programs プログラムフォルダ

WshShellオブジェクトのCurrentDirectoryプロパティ

現在の作業フォルダの取得と変更ができる。

使用例

Dim shell
Set shell = CreateObject("WScript.Shell")

'取得
Msgbox shell.CurrentDirectory      'C:\Script

'変更
shell.CurrentDirectory = "C:\Test"
Msgbox shell.CurrentDirectory      'C:\Test

VBAだとChDirChDriveを使って現在の作業フォルダを変更できるが、ネットワーク上の共有フォルダを指定するには、ネットワークドライブを設定しておく必要があった。
VBAでも上記のやり方で、ネットワーク上の共有フォルダを指定できて、「ファイルを開く」ダイアログボックスの初期に表示されるフォルダを制御できる。

WScriptオブジェクトのパス関係のプロパティ

WSHプログラムや実行中のスクリプトのパスを取得できる。

プロパティ 説明
Name Windows Script Hostという文字列
Path Windows Script Hostプログラムがある場所
ScriptName スクリプトファイルのファイル名
ScriptFullName スクリプトファイルのフルパス

使用例

Msgbox WScript.Name
Msgbox WScript.Path
Msgbox WScript.ScriptName
Msgbox WScript.ScriptFullName

GetAbsolutePathNameメソッドについて

起動したスクリプトファイルと同じフォルダ内にあるtest.txtの絶対パスを取得したい場合

Dim fso, buf

Set fso = CreateObject("Scripting.FileSystemObject")
buf = fso.GetAbsolutePathName("test.txt")

で取得できるが、フォルダがネットワーク上の共有フォルダである場合は(共有フォルダでなくローカルのシステムフォルダが作業フォルダになってしまうので)うまくいかない。その場合は

Dim fso, buf

Set fso = CreateObject("Scripting.FileSystemObject")
buf = fso.GetParentFolderName(WScript.ScriptFullName) & "\" & "test.txt"

で取得できる。ただし以下のやり方でも取得できる。

Dim fso, buf

Set fso = CreateObject("Scripting.FileSystemObject")
buf = fso.GetAbsolutePathName(WScript.ScriptFullName & "\..\test.txt")

test.txtがスクリプトファイルの一つ上の階層にある場合も、以下のようにすればよい。

Dim fso, buf

Set fso = CreateObject("Scripting.FileSystemObject")
buf = fso.GetAbsolutePathName(WScript.ScriptFullName & "\..\..\test.txt")

GetParentFolderNameを2重に適用するよりは、こちらのほうが使いやすい。