概要
- WSH でカレントフォルダを得るには、WshShell#CurrentDirectory プロパティを使う
- ショートカットから実行する場合は、「作業フォルダ」の値に注意
間違った方法
Windows Script Host でカレントフォルダを得ようとする場合、これまでは
var cwd = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf("\\")+1);
のようなことをしていた。
スクリプトのパスから、ファイル名を除いた部分を返しているだけだ。
しかし、ショートカットから実行したり、パスを通した上で他のフォルダから実行すると、スクリプトの実体が存在するフォルダが返ってくるので、厳密な意味でではカレントフォルダではない。また、表現が面倒という問題があった。
正しい方法
そんな中、たまたま WshShell オブジェクトに CurrentDirectory なるプロパティがあることが分かった。これ使えばいいじゃん。というか、今まで何やっていたんだ。
var cwd = WScript.CreateObject("WScript.Shell").CurrentDirectory;
すっきり。
これで、スクリプト本体にパスを通して、他のフォルダから実行しても、実行しているフォルダをちゃんと得ることができる。
なお、以下の表現でもカレントフォルダを得られることがわかった。当たり前すぎるけど。
var fso = WScript.CreateObject("Scripting.FileSystemObject"); var cwd = fso.GetFolder(".").Path;
ショートカットの「作業ディレクトリ」の設定に注意
ところが、スクリプトをショートカットから実行していると、上記コードを使っても、カレントフォルダ以外が返ってくることがあった。
実験してみたところ、上記コードによって得られるカレントフォルダは、どうやらショートカットのプロパティの「作業フォルダ」の値に依存しているらしい。
そのため、ショートカットから実行してカレントフォルダを使う場合には、この「作業フォルダ」の値を確認しておく必要がある。
少し面倒だけど、Windows のショートカットの仕様くさいから、これはどうしようもなさそう。
カレントフォルダの変更
なお、WshShell#CurrentDirectory は書き込み可能なプロパティなので、文字列でパスを代入すれば、簡単にカレントフォルダを変更できる。使いどころがあるかどうかは不明だけど。
WScript.CreateObject("WScript.Shell").CurrentDirectory = "E:\\";
代入するパスは、相対パスでも絶対パスでもいい。
参考文献
- 1.11 カレントディレクトリを得る <http://www.happy2-island.com/vbs/cafe02/capter00111.shtml>
- CurrentDirectory プロパティ <http://msdn.microsoft.com/ja-jp/library/cc364350(v=MSDN.10).aspx>