LuaとWSHを使ったスクリプト作成における変数の受け渡しについて

このQ&Aのポイント
  • LuaとWSHを使ったスクリプト作成において、Lua側からWSHで得た変数を受け取る方法について質問があります。
  • 具体的には、Lua側でos.executeを使いWSHを実行し、WSHのインプットボックスで入力した値をLua側の変数に格納したいと考えています。
  • どなたかご教授いただけると幸いです。
回答を見る
  • ベストアンサー

LuaとWSHについて

初心者です。 LuaとWSHを使ってスクリプトを作成しています。 Luaの記述でos.executeを使いWSH(.vbs)を実行するのですが、 WSHで得た変数をLua側に渡すことはできますでしょうか? 具体的には(一部抜粋)、 ---Lua側--- os.execute(インプット.vbs) inputxxx = input ---WSH側(インプット.vbs)--- Input = InputBox("数値を入力してください") という記述で、 Luaを実行し、WSH側のインプットボックスで入力した値(input)を Lua側の変数inpuxxxに入れたいです。 どなたかお助け頂けると有難いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.2

InputBoxを二つ以上というのは、表示するメッセージや入力後の処理が異なるInputBoxということでしょうか。 数が少なければ個別に作ってもいいのですが、増えると管理が大変です。 1つの方法としては、Luaの関数でVBScriptのInputBoxを呼び出すものを作ってしまうというのがあります。 ---Lua側--- function inputbox(prompt) local handle = io.popen("cscript //nologo インプット3.vbs " .. prompt) local rv = handle:read("*a") handle:close() return rv end inputxxx = inputbox("数値を入力してください") ---WSH側(インプット2.vbs)--- set Args = WScript.Arguments set SO = Wscript.Stdout if Args.Count > 0 then p0 = Args(0) else p0 = "" end if Input = InputBox(p0) SO.WriteLine Input およそこんな感じです。 なお、ここではコマンドライン引数を使っていますが、他にパイプを使う方法もあります。 と、ここまで書いて1つ思い出しました。 当方で使っているなでしこ内蔵Luaは日本語に対応していないのでいわゆるSJISの5c問題があります。 質問者様の環境は大丈夫でしょうか。 具体例ですが、Luaで inputxxx = inputbox("代表値を入力してください") とすると、メッセージボックスのプロンプトは 代葡lを入力してください と文字化けしてしまいます。 Luaの文字列処理の問題なので、呼び出す.vbsファイルのファイル名にも同様の現象が発生します。 なおこの場合は、 inputxxx = inputbox("代表\値を入力してください") で回避できますが、こういう状況ではなるべく日本語は避けたいので、そうなると上に書いたことも採用していいかどうか・・・ 対策としては、やや複雑になりますが、日本語の文字列はWSHに持たせておいて、Luaからの指示は数値や英数字の文字列で与えてそれを元にWSHで文字列を選択する、という方法が考えられます。 数が少なければ個別に作った方が楽かもしれません。

参考URL:
http://ja.wikipedia.org/wiki/Shift_JIS

その他の回答 (1)

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.1

LuaからVBScript(インプット.vbs)を起動することはできたのですね。 値をLuaで受ける方法ですが、Windowsのエラー値(?)を使う方法と、パイプで文字列を受ける方法があるようです。 簡単なのはWindowsのエラー値(?)を使う方法です。たとえば以下のようにします。 ---Lua側--- inputxxx = os.execute("インプット1.vbs" ) ---WSH側(インプット1.vbs)--- Input = InputBox("数値を入力してください") WScript.Quit Input ただ、この方法では整数(Long)しか受け取れないですし、なによりエラーが発生した場合の(Windowsが出す本物の)エラー値と通常の戻り値との区別がつきません。 それゆえ、パイプを使って文字列を受ける方がいいと思います。たとえば以下のようにします。 ---Lua側--- handle = io.popen("cscript //nologo インプット2.vbs") inputxxx = handle:read("*a") handle:close() ---WSH側(インプット2.vbs)--- set SO = WScript.StdOut Input = InputBox("数値を入力してください") SO.WriteLine Input やや細かい話ですが、WScript.StdOutは本来cscript.exe専用のはずです。 しかし今回Luaから呼び出した際には、"cscript //nologo インプット2.vbs"を"wscript //nologo インプット2.vbs"にしても動きました。ところが単に"インプット2.vbs"とするとSO.WriteLineのところでエラーになりました。このあたりどうなっているのかはちょっとわかりません。 また、//nologoオプションはなくても動きますが、万が一にも標準エラー出力のバッファがいっぱいになって停止したりしないように入れておくのがよいと思います。 動作確認ですが、こちらではWindows XP SP3にてなでしこ1.5332内蔵のLuaを用いました。他のLuaでもWindows用のものなら大丈夫なはずです。 http://stackoverflow.com/questions/9676113/lua-os-execute-return-value http://msdn.microsoft.com/ja-jp/library/cc364475.aspx

参考URL:
http://stackoverflow.com/questions/9676113/lua-os-execute-return-value
december12
質問者

お礼

ありがとうございます! こちらの環境でも確認できました! もうひとつ質問なのですが、InputBoxを二つ以上使用したい場合には、やはりvbsを複数持たせる必要があるのでしょうか?

関連するQ&A

  • 【WSH】スクリプトを作るスクリプト

    初めて質問させていただきます。 規定によりフリーソフトがインストールできない為 社内で使用するスクリプトをWSH(vbs)で作成しました。 次の段階として、そのスクリプトをユーザーの入力に合わせて作成するスクリプトを 作成しようとしているのですが、一つ問題があり先に進めなくなってしましました。 目的としては InputBox関数でユーザーが入力したパスをWriteLineでスクリプト内に 入れ込みたいんですが、 例えば下記のようなスクリプトを組み、走らせて作成される 「スクリプトA.vbs」を走らせても、もちろん p としか表示されません。 p = InputBox("フォルダのパスを入力してください。") Set objFS = CreateObject("Scripting.FileSystemObject") Set objTS = objFS.CreateTextFile("スクリプトA.vbs") objTS.WriteLine "MsgBox ""p""" objTS.Close WriteLineの中に変数を代入することは不可能なんでしょうか? それ以外でもいい方法があればご教授いただきたいです。 よろしくお願いします。

  • luaで2回目以降の呼び出しで変数を保持しておく

    C/C++とLua言語で開発しています。 メインはC/C++言語でつくっていてて、補助的なスクリプト部分はLuaです。 そこで、たとえば、F1キーを押したらLuaのスクリプトAを起動するとします。 そしたら、LuaのスクリプトAが処理され、またC/C++に処理がもどってきます。 そのあと、また別の機会にF1を押したら、前回のLuaスクリプトAの 処理で使用した変数を保持したままの状態から、再度Luaスクリプトを 実行したいのです。 グローバル変数を使って実現しようとしましたが、うまくできませんでした。 ファイル:hoge.lua [START] _G[switch] = 0; if _G[switch] == 0 then _G[value] = 100; end _G[value] = 120 [END] と、作ったのですが、2回目以降呼び出しても _G[switch] = 0 をとおるので どうしても _G[value] = 100 となってしまいます。 したい処理としては、2回目以降の呼び出しで、_G[switch] = 0 とならずに _G[value] の1回目の処理の結果を保持したままの状態で、処理したいのです。 条件として、F1キー(指定したキー)でLuaスクリプトを呼び出せて、 C/C++言語の方は、処理を続行 処理を続行中にF1キー(指定したキー)を押すと、前回の状態(変数)を保持したまま Luaスクリプトを処理するというものです。 上の実装した例でいうところでは、_G[value] が 120 の状態でスクリプトを処理したいのです。 どのような実装方法があるのでしょうか?

  • wsh(vbs)のデバッグについて

    MSのScriptDebuggerをインストールした後に コマンドプロンプトからオプションの //D を付けてスクリプトをキックしたのですが、普通にスクリプトが実行されるだけでデバッガが起動してくれません。どの様にしたらデバッガが起動するのでしょうか。MSのScriptDebuggerのページ等を参照しても原因が分からず困っています。 よろしくお願いいたします。 実行したコマンド:cscript ×××.vbs //D です。 WSHのバージョンは5.6、インストールしたデバッガのバージョンは1.0.7295のXP/2000用です。

  • WSHで.RMIファイルを再生

    こんにちは。 OSはWIN2K SP-4,WSHは5.6を使用しています。 c:x.RMIファイルをWSHを利用して再生するには どのようなスクリプト(wscript)を記述すれば よろしいでしょうか? よろしくお願いいたします。

  • WSHのrunメソッドではできないのでしょうか?

    VBS(WSH)初心者です。よろしくお願いします。 (質問) 複数の実行ファイル(exeファイル)を、一つづつ(一つ目が終了してから、二つ目を)実行するようにVBSを作りたいのですが・・・うまくいかず、同時に実行されてしまいます。 (詳細) WSHのRunメソッドで終了待ちフラグをTrueにセットし、コマンドの終了を待って次を実行しているつもりなのですが、単純な実行ファイル(notepad.exeとか)であれば、終了を待ってから次へ進んでいくようですが、実行ファイルが別の実行ファイルを呼び出すような場合、先の実行ファイル(のプロセス)が終了した時点で、スクリプトの次(Runメソッドの次の行)を実行してしまうようです。ですからこの場合、画面上では複数の動きが見られることとなってしまい、意図した動きとなりません。 このような場合、どのように修正すれば意図した動きが可能でしょうか?また、もしRunメソッドではできないなら、何か対応策はあるのでしょうか? どうぞよろしくお願いいたします

  • WindowsのWSH、VBSの本・参考サイト探してます。

    WSH または VBSなどを使用して スクリプトファイルをつくりたいです。 たとえば、バッチファイルを実行して、コントロールパネルを開き値を変更したりなど… 言語がまったくの初心者なのですが、なにか参考になる本または、参考になるサイトなどあればご教授ください。

  • WSH ~.vbs のデバッグについて

    お世話になります。 ~.vbsのデバッグについて教えてください。 スクリプトデバッガを使って1ステップづつ実行したいのですが、起動の仕方がわかりません。 手順を教えていただけないでしょうか? STOPステートメントでスクリプトデバッガが起動する旨MSのサイトに記述がありましたが、起動しません。 よろしくお願いします。

  • wsh で関数を指定して実行したい

    wsh について質問です。 cscript などを実行する際に 実行する関数を引数によって制御したいのですが、 そうするにはスクリプト内に引数で分岐して関数を呼び分けるコードを 記述するようなやりかたしかないのでしょうか? cscript(wscript) 自体には関数名を指定して それを実行する仕組みはないのでしょうか。 よろしくお願いします。

  • 起動時に勝手にWSHが起動する

    つい先日ウイルスに感染し、ノートンパワーイレイサーで感染したであろうファイルをすべて消去したところ、スクリプトファイルを消去したは良いものの、起動時にWSHがvbsを実行する設定が残ってしまったらしく、起動するたびも画像のような消去したスクリプトファイルを実行しようとするダイアログが出てきます。 完璧に検索したわけではありませんが、いくら検索しても解決法が見当たらなかったため質問させてもらいました。 どなたか解決法をご存知の方、教えていただけると幸いです。 エラーコード Windows Script Host スクリプトファイル"C:\Users\Public\Libraries\Checks.vbs"が見つかりません。

  • WSH(Excel出力)の同時実行数の制限

    WSHでExcel出力処理を行っているのですが、 同時実行数が30を超えると、Excelが不安定になるようで、  Set objBook = objExcelApp.Workbooks.Open("C:\xxx\zzz.xls", 0, False) の行で、  エラー:WorkbooksクラスのOpenプロパティを取得できません。  コード:800A03EC  ソース: Microsost Office Excel というエラーが発生して異常終了してしまうのです。 同時実行数の上限など、また、それ以外の原因について、 ご存知の方がいらっしゃいましたら、コメント頂ければ幸いです。 ちなみに、同時実行数が30未満の場合は、正常終了するので、 コードの内容には、問題ないと思っております。 Excelのバージョンは、2003で、ファイルの構成は、 wsfファイル(yyy.wsf) vbsファイル(wsh_excel.vbs)の2ファイルを配置し、 以下のような形で、実行しています。 Set WshShell = Server.CreateObject("WScript.Shell") Set objBatch = WshShell.Exec(strCmd)  ※ strCmdには、以下のような値が設定されます。     cmd.exe wscript.exe "C:\xxx\yyy.wsf" ■ yyy.wsfの内容 <?xml version="1.0" encoding="shift_jis" ?> <job id="zzz"> <script language="VBScript" src="wsh_excel.vbs"/> <script language="VBScript">  Call Excel_Main() </script> </job> ■ wsh_excel.vbsの内容(抜粋) Sub Excel_Main()  Set objExcelApp = Wscript.CreateObject("Excel.Application")  Set objBook = objExcelApp.Workbooks.Open("C:\xxx\zzz.xls", 0, False)     :     : End Sub

専門家に質問してみよう