• ベストアンサー

WindowsScript で実行し終了を待つ方法

Windows Script Host を使うスクリプトでプログラムなどを実行し終了を待つ方法にはどんなものがありますか。 ただ、最終的には、ウィンドウを最小化状態にして実行し終了を待ちたいだけですので、まったく別の方法があればそれも知りたいです。 例えば WScript.Shell の Exec 関数を使い、返されるオブジェクトのStatusプロパティを見ることで待つことができます。 他にはどんな方法があるでしょうか。 最小化状態で実行するために Shell.Application の ShellExecute 関数を使いたいのですが、この関数を使った場合、終了を待つ方法はありますか。

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

  • ベストアンサー
  • 8ive22ty
  • ベストアンサー率52% (770/1479)
回答No.1

runメソッドで可能です。 http://msdn.microsoft.com/ja-jp/library/cc364421 4番目の引数(bWaitOnReturn)の設定で、 プログラムの実行が終了するまでスクリプトを待機させるかどうかを指定できます。 true に設定すれば待機します。 ---質問からは外れますが、 3番目の引数(intWindowStyle)でウィンドウの外観(表示、非表示、最小化、最大化など)を設定できます。 > まったく別の方法があればそれも知りたいです。 WSHではありませんが、 ShelleEecuteEX関数と WaitForSingleObject関数を使用して、プロセスの終了を待つ、というのが使いやすいです。 ShelleEecuteEX http://msdn.microsoft.com/en-us/library/windows/desktop/bb762154%28v=vs.85%29.aspx WaitForSingleObject http://msdn.microsoft.com/ja-jp/library/cc429427.aspx

cdtv328
質問者

お礼

ありがとうございます。

関連するQ&A

  • WSHプログラミングで、Shell実行プロセスが終了しない内に、次の処理が実行されちゃいます・・・

    WSH(WindowsScriptingHost)でプログラミングを行っております。 以下のように、「A.exe」実行後、「B.exe」を実行するようにスクリプトを記述しています。 ところが、実際に実行してみると、「A.exe」が終了しない内に、「B.exe」が実行されてしまっている様なのです。 しかし、プログラム処理上、「A.exe」が実行終了してからでないと、「B.exe」を実行するのはまずいのです。 WSHで、「A.exe」が実行終了するまで、「B.exe」を実行させないようなスクリプトの記述方法を教えて下さい。 Set Shell = CreateObject("WScript.Shell") Shell.Run "cmd.exe /c D:\A.exe" Shell.Run "cmd.exe /c D:\B.exe"

  • VBAで外部プログラムを非表示で実行するには

    VBAとVBScriptを混同しているのかもしれませんがよく分からないので教えてください。 Excel2010のVBAから、外部プログラム(test.exe)をコマンドプロンプトを非表示の状態で実行して、外部プログラムの実行が終了するのを待ってから、次の処理をさせたいのですが、test1のプログラムでは(A)の部分でエラーになってしまいます。また、test2のプログラムでは正しく実行されるのですがコマンドプロンプトのウインドウを非表示にする方法がよく分かりません。 test1のプログラムでエラーをでなくする方法、または、test2のプログラムでコマンドプロンプトのウインドウを非表示にする方法がありましたら教えてください。 ------------------------------------------------------- Sub test1()  Dim ws As Object  Dim we As Object  Dim command As String  command = "C:\test.exe"  Set ws = CreateObject("WScript.Shell")  Set we = ws.Run("%ComSpec% /c " & command, 0, False) '<===(A)  Set we = Nothing  Set ws = Nothing End Sub ------------------------------------------------------- Sub test2()  Dim ws As Object  Dim we As Object  Dim command As String  command = "C:\test.exe"  Set ws = CreateObject("WScript.Shell")  Set we = ws.exec("%ComSpec% /c " & command)  Do Until we.Status   DoEvents  Loop  Set we = Nothing  Set ws = Nothing End Sub -------------------------------------------------------

  • VBSファイルを定期的に自動実行する方法

    毎日同時刻に下記のVBSファイルを自動実行したいと思います。 タスクスケジューラで実行すると download.exe は起動しますが 表示されたダイアログがアクティブ状態にならないため (タイトルバーが灰色のまま、タスクバーのボタンが点滅)、 文字入力ができないまま、処理が終了してしまいます。 1.ダイアログをアクティブにし、正常に処理を実行させるには   どのように記述すれば良いですか? 2.このVBSファイルをユーザーがログオフされている状態で   実行することは可能ですか? 恐れ入りますが、ご存じの方がおられましたら、ご教示願います。 <環境> Windows 2008 Server R2 standard (64ビット) <D:\aaa.vbs> Set objShell = WScript.CreateObject("WScript.Shell") 'ダウンロードEXEを実行 Set objExec = objShell.Exec("D:\download.exe") WScript.Sleep 1000 objShell.AppActivate(objExec.ProcessID) 'ファイルのダウンロード先を指定し、実行(ENTER) WScript.Sleep 1000 objShell.SendKeys "D:\data.txt~"

  • Runメソッドで実行したコマンドプロンプトの結果を1行ずつ取得する方法

    Runメソッドで実行したコマンドプロンプトの結果を1行ずつ取得する方法を教えてください。 pingの実行結果を1行ずつ取得したいのですがどうも上手く行きません。 Set WshShell = WScript.CreateObject("WScript.Shell") Set objWshScriptExec = WshShell.exec("ping 192.168.0.1") Set objStdOut = objWshScriptExec.StdOut strLine = objStdOut.ReadLine execメソッドを使用するのであればこんな感じで1行取得することが出来るかと思いますが、窓の非表示で同じことをやりたいので同じことをRunメソッドにて取得できればいう希望からの質問でした。 どうぞよろしくお願い致します。

  • 適切なシェルスクリプトの実行方法について

    シェルスクリプト内でi18nの再読み込みをするために . /etc/sysconfig/i18n と記述するとシェルスクリプト終了後にi18nの内容が反映されていません。 シェルスクリプト自体は ./shell1.sh という形で実行しています。 質問1:このようになるのは「./shell1.sh」と実行したスクリプトは 新たに作成された子プロセスによって実行される為、スクリプトが終了し 親プロセスに戻っても親自身は再読み込みを行なっていないから、という認識で間違いないでしょうか。 質問2:この現象の回避策として「source shell1.sh」とsourceコマンドで シェルスクリプトを実行する方法を試してみました。 実際に上手くいったのですが、「set -e」を使っているとエラー時に ログアウトしてしまうなどの弊害もありました。 他に適切な回避策に問題はないでしょうか。 ご存知のかた、お手数ですがご解答のほど宜しくお願い致します。

  • 複数コマンドを実行するには

    一回で完結しないコマンドはどのように書けば、実行できるのでしょうか? たとえば、下記のようにコマンドを実行して、受信メールを表示させたいのですが、方法が分かりません。 ------------------------- telnet localhost pop3 user hoge@hoge.com pass hoge retr 1 ------------------------- 一回で完結していないので、当たり前かもしれませんが、 下記のようにやっても、エラーがでてしまいます。 ------------------------- shell_exec('telnet localhost pop3'); shell_exec('user hoge@hoge.com'); shell_exec('pass hoge'); echo shell_exec('retr 1'); -------------------------

    • ベストアンサー
    • PHP
  • サーバーに保存されているVB6で作成したexeをWEBで実行したいので

    サーバーに保存されているVB6で作成したexeをWEBで実行したいのですが下記エラーがでてきます。 エラーActiveXコンポーネントはオブジェクトを作成できません"Wscript.Shell" "Wscript.Shell"に原因があるみたいなのですが、どのようにしたらいいでしょうか。 個別テスト ・サーバでProject1.exeをダブルクリックすると正常起動します。 ・クライアントPCでもProject1.exeダブルクリックすると正常起動します。 ・クライアントPCでIISを起動しWEBで下記ソースを実行すると正常起動します。 環境 サーバー Windows Server 2003 IIS クライアント Windows XP 【ソース】 <html> <head> <title>サンプル</title> <script language="VBScript"> Sub Sample4() Dim WshShell Set WshShell = CreateObject("Wscript.Shell") '実行 WshShell.Run "C:\Inetpub\wwwroot\test1\Project1.exe" , 1 , True End Sub </script> </head> <body> <form name="frm1"> <span id="txt1"></span> <br> <input type=button value="テスト" name="btn1" onclick="vbscript:Sample4()" /> </form> </body> </html>

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

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

  • PHPからシェルコマンドの実行

    PHPからシェルコマンドを実行したいのですが SSHやSCPコマンドが使えません。 phpからlsなどは問題なく実行できます。 具体的には以下のように書いています。 `scp test.log user@host:/home/hoge`; shell_exec()を使っても実行されませんでした。 環境は以下のとおりです。 PHP 5.4.17 CentOS 5.8 sshやscpコマンドをphpから実行するには何か特別な方法が必要なのでしょうか。 ご存知の方、教えてください。

    • ベストアンサー
    • PHP
  • VBSでレジストリーの削除方法

    VBScriptにより、サーバー上で単にレジストリーのキーごとすべて削除したいのですが、 キーがない場合そこでエラーになり終了してしまいます。 キーの有無にかかわらず、キーがある場合のみ削除するにはどのような スクリプトにしたらよいかアドバイスをください。 スクリプトはこんな感じです。 -------------------------------------------------------------------- Dim WshShell dim bKey Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.RegDelete "HKLM\Software\Tivoli\" WshShell.RegDelete "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\lcf\" WshShell.RegDelete "HKLM\System\ControlSet001\Enum\Root\Legacy_lcfd\" WshShell.RegDelete "HKLM\System\ControlSet001\Enum\Root\Legacy_TECWINADAPTER*\" WshShell.RegDelete "HKLM\System\ControlSet001\Services\lcfd\" WshShell.RegDelete "HKLM\System\ControlSet001\Services\lcfd\TECWINADAPTER*\" WScript.quit ----------------------------------------------------------------- UNIX Shell はわかるのですが、Windowsに関してはさっぱりわかりません(Object志向のものは苦手なもので・・・)。 もしこれらをUNIX Shell(b,c,k,Shell)でスクリプトを作成する場合、 ひとつひとつif文でファイルの有無を判定し、その結果を標準出力へ出し、その結果、「真」であれば(ファイルがある場合)そのキーを削除する・・・そして、スクリプトの結果を実行ユーザーのホームディレクトリー直下にファイルにして保存・・・というようにするのが一般的ですが、Windowsではどのように記述すればよいかご回答いただければ幸いです。 みなさんもお忙しいと思いますがよろしくお願いします。