Windows Script Host でカレントフォルダを得る

概要

  • 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;

ショートカットの「作業ディレクトリ」の設定に注意

ところが、スクリプトをショートカットから実行していると、上記コードを使っても、カレントフォルダ以外が返ってくることがあった。

実験してみたところ、上記コードによって得られるカレントフォルダは、どうやらショートカットのプロパティの「作業フォルダ」の値に依存しているらしい。

image

そのため、ショートカットから実行してカレントフォルダを使う場合には、この「作業フォルダ」の値を確認しておく必要がある。

少し面倒だけど、Windows のショートカットの仕様くさいから、これはどうしようもなさそう。

カレントフォルダの変更

なお、WshShell#CurrentDirectory は書き込み可能なプロパティなので、文字列でパスを代入すれば、簡単にカレントフォルダを変更できる。使いどころがあるかどうかは不明だけど。

WScript.CreateObject("WScript.Shell").CurrentDirectory = "E:\\";

代入するパスは、相対パスでも絶対パスでもいい。

参考文献

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>