【WSH事始め】カレントディレクトリって何処なのか?

はじめに

 わかっている人はわかってる事柄。コレとコレどう違うの? 存在意義あるの?って思っちゃうだろうなぁって事へ ちょっとした解説を加えます。説明丸投げの各【前提知識】〜 の記事レベルの理解は必要です。

CurrentDirectory プロパティについて考える

 WSHに限らずバッチ処理って、ファイルを扱うなら入出力がどの階層に在るのかを意識しないといけません。常にfull path指定すれば間違いないですが、フォルダ移動する度にpath修正するのでは面倒くさ過ぎる。なので相対パスでファイル操作する訳ですが、その際、今何処のディレクトリに居るかが重要になります。

 当たり前の事ですが、相対パス指定ではカレントディレクトリに入出力ファイルが存在する場合、path部分は不要でファイル名だけでファイル操作が出来ます。

 JScript でも相対パスが使えるメソッドやプロパティが幾つもありますが、カレントディレクトリはWshShell オブジェクトの CurrentDirectory プロパティで取得・設定出来ます。

 取り敢えず取得してみると、現在のディレクトリが自動で設定されていることが確認出来ます。又、カレントディレクトリの変更後は、設定したディレクトリ内のファイルにファイル名だけでアクセス出来ます。


結論:しっかりディレクトリ移動してから実行するが吉

 一見なんでもなさそうなCurrentDirectory プロパティですが、実行方法によってCurrentDirectory プロパティに設定される『カレントディレクトリ』が異なる場合があります。

 GUI なwscript とCUI なcscript の違いによるものなのですが少々クセがあるので条件を挙げて整理しておきます。

 まず、wscript とcscript で共通して言えることですが基本的には実行するスクリプトがある階層がCurrentDirectory プロパティに設定されます。以下のような実行方法をとった場合です。

・スクリプトファイルの存在する階層へ移動して直接スクリプトを実行する。
・実行するスクリプトファイルのショートカットファイル(〜.lnk)を実行する。

※ ショートカット実行の場合はどこにショートカットを置いても結果は変わりません。


 ところがcscript で実行且つ、パス指定でスクリプト実行すると、コマンドを叩いた時にいる階層がCurrentDirectory プロパティに設定されてしまいます。

 例えばコマンドプロントで下記の様な階層からコマンド実行するとCurrentDirectory プロパティは『C:¥lib』ではなく『C:¥user』となります。

Cuser¥> cscript  Clib¥test.jp 


 MS Docsの解説には『アクティブなプロセスの現在の作業ディレクトリを取得または変更します。』とありますが、cscriptで実行した時、コマンドプロンプトが『アクティブなプロセス』となり、その時の階層がカレントディレクトリになってしまうのかも知れませんが、使い勝手に疑問の湧く動きではあります。


念の為のまとめ

 一応、

CurrentDirectory プロパティ = カレントディレクトリ

 となっている為、他の階層にディレクトリやファイルを新規作成したり削除してもCurrentDirectory プロパティの”設定“以外でカレントディレクトリが変更される事はありません。


 後、その他の特記事項は以下の通り。

・プロパティの属性は string型
・存在しないディレクトリは設定出来ない。
・CurrentDirectory プロパティへ設定したフォルダは空でも移動・削除不可。
(「使用中のフォルダ」となりプロテクトが掛かる。)

 因みにpathがstring型であるという事は、スクリプト内で使用する時 直接受け取るのでない限り、“¥”をエスケープするか、“/” へ置き換える編集作業が必要になるという事です。まぁ相対パス使えば楽ですが。(ディレクトリパスを変数等に保存したい場合はfolderオブジェクトの形でやり取りするのがよろしいかと思います。詳細は別の機会に。)


検証プログラム例

 おまけを追加しました。コードを拡張子"js" のテキストファイルにコピペして保存してショートカットも作って、色々なディレクトリ階層から実行してみてください。(サブディレクトリやファイルを新規作成したり、カレントディレクトリの設定・取得などはコードが煩雑になったので割愛しました。)

var objWshShell = WScript.CreateObject("WScript.Shell");
var strMsg  = "【CurrentDirectoryプロパティの値確認テスト】\n\n";
strMsg +=  "CurrentDirectoryプロパティ戻り値:\n\t" + objWshShell.CurrentDirectory + "\n";
strMsg +=  "ScriptFullNameプロパティ戻り値:\n\t" + WScript.ScriptFullName + "\n";

WScript.Echo(strMsg);

 尚、実行結果を2例あげておきます。コマンドプロンプト上で異なるディレクトリから実行しています。

e:\test> cscript test.jsCurrentDirectoryプロパティの値確認テスト】

CurrentDirectoryプロパティ戻り値:
       e:\test
ScriptFullNameプロパティ戻り値:
       e:\test\test.js
e:\Users> cscript  e:\test\test.jsCurrentDirectoryプロパティの値確認テスト】

CurrentDirectoryプロパティ戻り値:
       e:\Users
ScriptFullNameプロパティ戻り値:
       e:\test\test.js


以下、使用したWScriptオブジェクトのプロパティ説明。



この記事が気に入ったらサポートをしてみませんか?