[リストへもどる]
一括表示

タイトル練馬のスクリプトに関して
Q&A 1045
投稿日: 2017/02/09(Thu) 16:44
投稿者とりがら
練馬をいつも便利に使わせていただいております。

練馬のスクリプトに関して質問ですが、スクリプトのコード内で
「登録してあるスクリプトファイルのパス」若しくは「練馬の実行ファイルのパス」又はそれに類するものを取得する方法があれば、お知恵をお貸しください。

[やりたいこと]
共用関数を外部ファイルに退避して、各スクリプトから呼び出して使用したい。
その際に、外部ファイルへの参照を相対パスで指定したい。

[コードのイメージ]
Option Explicit
' 共用関数のロード
Call Include("lib.vbs") ' 相対パスで指定

'リネーム処理
Function Proc(name)
' lib.vbsを用いたリネーム処理
End Function

' インクルード処理
Sub Include(strFilePath)
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim wshell : Set wshell = CreateObject("WScript.Shell")
strFilePath = fso.BuildPath(wshell.CurrentDirectory, strFilePath) ' "wshell.CurrentDirectory"が練馬の起動方法により不定
Dim file : Set file = fso.OpenTextFile(strFilePath, 1)
ExecuteGlobal file.ReadAll()
file.Close
Set fso = Nothing
Set file = Nothing
End Sub

[問題点]
スクリプトの現在のディレクトリが必ずしもスクリプトの実行フォルダと同じであるとは限らないため、
CreateObject("WScript.Shell").CurrentDirectoryから、パスを取得しようとすると練馬の起動方法により変化してしまう。
CreateObject("Scripting.FileSystemObject").GetFolder(".") も同様。
WScript.ScriptFullNameは、"WScript"が宣言されていないと怒られる。

[環境]
win10
練馬ver.5.0β

タイトルRe: 練馬のスクリプトに関して
Q&A 1046
投稿日: 2017/02/09(Thu) 18:30
投稿者やまたん
VBScript自体あまり詳しくないので外してるかもしれませんが思いついたことだけ書きます。

カレントのパスが毎回異なるから外部スクリプトへのパスが参照できなくて
インクルードできないという解釈で良いでしょうか?。
練馬のスクリプトは拡張子 .vbs で練馬と同じフォルダに保存してますが
実行はそのvbsファイルを起動しているのではなく練馬自体がファイルから
スクリプトを読み込んで内部の MSScriptControl で実行しています。
ですので読み込んだ後はパスとかの意識はなくなっているかもしれません。
(vbsファイルはあくまでスクリプトを保存したデータファイル扱い)

CurrentDirectory が外部スクリプトが保存されているパスと同じなら問題ないのでしょうか?。
(この辺はやったことないので全然わからないので・・・)
外部スクリプトの保存先は固定だと思うので
wshell.CurrentDirectory にそのパスを代入してカレントを変更するとかではダメでしょうか?。
http://jugem-first.jugem.jp/?eid=64 を見ると代入だけでカレントが変更できるみたいですが。

あるいは lib.vbs を絶対パスで指定してはダメなのでしょうか?。
この辺も詳しくないので相対パスでないといけないのかどうかなど全然わかってませんが。

これくらいしか回答できませんデス。 m(_ _)m

タイトルRe^2: 練馬のスクリプトに関して
Q&A 1047
投稿日: 2017/02/09(Thu) 19:57
投稿者とりがら
素早い返信をありがとうございます。

> VBScript自体あまり詳しくないので

私はプログラマではありませんし、VBScriptにもほとんど触ったことがないので、私も全然詳しくないです。

> カレントのパスが毎回異なるから外部スクリプトへのパスが参照できなくて
> インクルードできないという解釈で良いでしょうか?。

その認識であっています。
例で書き込ませていただいたコードの場合、lib.vbsを練馬と同じフォルダに入れておき、
練馬の実行ファイルを直接ダブルクリックして起動すれば、正常に動作します。
(CurrentDirectory=練馬のフォルダ=lib.vbsを入れているフォルダが一致する)
しかし、例えば別のフォルダを起点として、リネーム対象のファイルを渡すようにして起動すると、
CurrentDirectoryがリネーム対象のファイルのフォルダに移ってしまい、lib.vbsが見つからないと怒られます。
(当環境では、ファイラから練馬を起動した際に発生。確認していないがエクスプローラーの送る経由でも同じかも)

> wshell.CurrentDirectory にそのパスを代入してカレントを変更するとかではダメでしょうか?。
> あるいは lib.vbs を絶対パスで指定してはダメなのでしょうか?。

結局は、lib.vbs を絶対パスで指定すれば動作します。
しかし、練馬をUSBに入れて出先で使用する際に、使用するすべてのvbsファイルに対して絶対パスを修正しなければなりません。
仮に、相対パスで指定できれば、その煩わしさを解消できるため、今回の質問をさせていただきました。
CurrentDirectoryへの代入も本質的には同じで、保存先が変わる度にコードの修正を必要とします。

> 練馬のスクリプトは拡張子 .vbs で練馬と同じフォルダに保存してますが
> 実行はそのvbsファイルを起動しているのではなく練馬自体がファイルから
> スクリプトを読み込んで内部の MSScriptControl で実行しています。

MSScriptControl で実行しているというのが、WScript.ScriptFullName で取得しようとした際に、
WScriptがないと怒られる原因なのでしょうか?(vbsを実行するホスト?が違うため?)
練馬を通さずに、直接vbsファイルをダブルクリックした場合は、wscript.exeで実行するので、
WScript オブジェクトを特に意識せずに扱うことができていますし、ScriptFullNameから実行中の
スクリプトへの絶対パスが取得できます。

今回は解決には至りませんでしたが、練馬の有用性は微塵も揺るぎません。これからも末永く使い続けたいと思います。
返信ありがとうございました。