• 締切済み

WSH.Runで待機できません

お世話になっております。 掲題の件でおしえてください。 Set objWshShell = CreateObject("WScript.Shell") ret = objWshShell.Run("abc.exe", 0, true) 上記のようなコードで、同期をとって外部プログラム(abc.exe)を実行させています。 abc.exeの中では別の外部プログラム(Setup.exe:InstallShieldで作成)を 同様にWSHで同期を取って実行させています。 上記コードををループを使って実行したところ、 Setup.exe実行中にabc.exeの処理が終了してしまうようで、意図した動作となりません。 どのようにしたら、Setup.exe終了を待機して、abc.exeを終了させられるのでしょうか? よろしくお願いいたします。 Win7;VB6

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

VB6でやっているならCreateProcessという APIで起動制御する方法が確実です。 このAPIはプロセスを起動し、スレッドと、 プロセスのハンドルを返します。 WairForSingleObjectというAPIでプロセス ハンドルを待機すれば、プロセス終了まで 停止した状態になります。 Type STARTUPINFO     cb As Long     lpReserved As String     lpDesktop As String     lpTitle As String     dwX As Long     dwY As Long     dwXSize As Long     dwYSize As Long     dwXCountChars As Long     dwYCountChars As Long     dwFillAttribute As Long     dwFlags As Long     wShowWindow As Integer     cbReserved2 As Integer     lpReserved2 As Long     hStdInput As Long     hStdOutput As Long     hStdError As Long End Type Type PROCESS_INFORMATION     hProcess As Long     hThread As Long     dwProcessId As Long     dwThreadId As Long End Type Declare Function CreateProcessA Lib "kernel32" _   (ByVal アプリ As Long, _    ByVal コマンド As String, _    ByVal プロセス継承 As Long, _    ByVal スレッド継承 As Long, _    ByVal 継承有無 As Long, _    ByVal フラグ As Long, _    ByVal 環境変数 As Long, _    ByVal カレント As Long, _    開始情報 As STARTUPINFO, _    プロセス情報 As PROCESS_INFORMATION) As Long Declare Function WaitForSingleObject Lib "kernel32" _   (ByVal ハンドル As Long, _    ByVal ミリ秒 As Long) As Long Declare Function CloseHandle Lib "kernel32" _    (ByVal ハンドル As Long) As Long プログラムはこんな感じ Dim 開始情報 As STRATUPINFO Dim プロセス As PROCESS_INFORMATION 開始情報.cb = Len(開始情報) '★必ず成功すると思って戻り値は調べない CreateProcessA 0, "Setup.exe ~", 0, 0, 0, &H20, 0, 0, _   開始情報,プロセス '★スレッドは不要なので直ぐ閉じる CloseHandle プロセス.hThread '★終わるまで待機する(-1は無期限待機の意味) WaitForSingleObject プロセス.hProcess, -1 '★終了後は閉じる CloseHandle プロセス.hProcess この方法はあらゆるアプリに対して使用できる。 というか、Windowsの基本アーキテクチャだから。 STARTUPINFOを使いこなすと、面白いこともできる。 CreateProcessの本当の定義ではアプリやカレントは 文字列だし、スレッド継承やプロセス継承はセキュリティ 記述子へのポインタなのだが、どうせNULLを指定する からLong型で定義している。&H20は通常プライオリティを 意味する値で長い定義名があるのだが、面倒なので 直定数にしました。興味があったら調べてください。 http://msdn.microsoft.com/ja-jp/library/cc429066.aspx

sugar_donut
質問者

お礼

早速のレスをありがとうございました。 御礼が遅くなりまして申し訳ありません。 結論から申し上げますと、 動作しない理由はその端末の環境不備にありました。 プログラムは正常に動作していました。 提示してくださった方法は知りませんでしたので、 次の機会に是非試してみたいと思います。 サンプルコード、リンク先の提示と、興味深く拝見しました。 丁寧にご回答いただき、ありがとうございました。

関連するQ&A

  • WSH動作しない!!(WScript.SleepとSendKeys?)

    WSHが動作しなくて困っています。 動作するコードとしないコードは次のとおりです。 いずれも@ITに掲載されているサンプルコードをそのままです。 動作しないコードについても,notepadの起動まではできます。 どうやら,sleepとsendkeysが動いてくれないようです。 <正常に動作するコード> Set objShell = WScript.CreateObject("WScript.Shell") WScript.Echo "メモ帳を起動します。" objShell.Run "notepad.exe" http://www.atmarkit.co.jp/fwin2k/operation/wsh03/wsh03_02.html <動作しないコード> Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "notepad.exe" WScript.Sleep 1000 objShell.SendKeys "hello" http://www.atmarkit.co.jp/fwin2k/operation/wsh05/wsh05_04.html ■動作環境 Win XP Pro IE 6.0 ちなみに,WSHファイルに対する実行権限はあります(フルコントロールです)。 以上なのですが,何か点検するべき事項などありましたらご教示ください。

  • HTMLにWSHを組み込む

    HTMLにWSHのコードを書く事は可能ですか? たとえば、ページ開くとNotePad.EXEが起動するようにしたいのですが 以下のような書き方をすると WScriptが宣言されていません。 とエラーになります。 <HTML> <HEAD> <TITLE>起動のテスト</TITLE> </HEAD> <meta http-equiv="Content-Script-Type" content="text/JavaScript"> <BODY> <SCRIPT LANGUAGE="JavaScript"> var title = "メモ帳"; var wsh = WScript.CreateObject("WScript.Shell"); wsh.Run( "NotePad.EXE" ); </SCRIPT> </BODY> </HTML> いい案がある方教えてください。

    • ベストアンサー
    • HTML
  • 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"

  • VBSでエラーとなってしまいます

    VBS(WSH)超初心者です。どうぞよろしくご教授ください。 Pcomm(AS400クライアント接続ソフト)のサイレントインストールを、VBS(WSH)でやりたいと思っていますがスクリプトエラーとなってしまいます。 <質問内容> 下記スクリプトを実行すると、PcommPath=の行で「ステートメントの末尾が不正です」となってしまいます。 多分、ダブルクォーテーションの使い方が間違ってると思うのですが、色々調べてみましたがわかりません。 どなたかご教授くださいませ。 なお、(VBSではなく)「ファイル名を指定して実行」からなら問題なくサイレントインストールできます (コメントアウトしてる D:\install・・・/qb"部分を実行) どうぞよろしくお願いいたします。 [スクリプト] Option Explicit Dim objWshShell,objWshScriptExec,PcommPath 'D:\install\pcomm\setup.exe /s /v"USEINI=\"C:\Pcomm.ini\" /qb" '上記中のPcom.iniはカストマイズ用のファイル。 ’上記で、「ファイル名を指定して実行」からなら問題なくサイレントインストールされます PcommPath="D:\install\pcomm\setup.exe /s /v"USEINI=\"C:\Pcomm.ini\" /qb"" Set objWshShell=WScript.CreateObject("WScript.Shell") Set objWshScriptExec=objWshShell.Exec(PcommPath) (以下略)

  • vbsでからプログラムを、オプションを指定して起動したい。

    vbsから、プログラムを実行する歳に、オプションを指定する方法を教えてください。 Firefoxを起動する際に以下のオプションをつけて実行したいのですが 上手くいきません。 (1)-new-tabオプション (2)URL =================================== Option Explicit Dim objWshShell Set objWshShell = WScript.CreateObject("WScript.Shell") objWshShell.Run """c:\Program Files\Mozilla Firefox\firefox.exe""" Set objWshShell = Nothing Firefoxを起動するだけであれば上の記述でいけますが (1)と(2)は objWshShell.Run """c:\Program Files\Mozilla Firefox\firefox.exe""" の後ろにどのように記述すればいいのでしょうか。

  • WSHで、1分ごとにプログラムを実行

    WSHで、1分ごとにプログラムを実行する書き方を伝授してください。 (例) メモ帳を起動し、終了する。 以上を1分ごとに繰り返す。 #WSHで動かしたいプログラムがあるが、WSHの素人からの質問です。

  • WSHスクリプトでブラウザ更新

    教えてください。 WSHスクリプトでブラウザの更新をF5ではなくてControl + Rしたいのです。 Set WshShell = WScript.CreateObject("WScript.Shell") WScript.Sleep 2000 WshShell.AppActivate "テスト" WScript.Sleep 2000 WshShell.SendKeys "^R" WScript.Sleep 2000 WScript.Echo "終了" 最初の一回目の実行時はできるのですが、それ以降更新してくれません。 よろしくお願いいたします。

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

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

  • ASPからVBScriptの実行

    ASPから下のVBScriptを実行使用とすると "500"Internal Server Error が出力されて困ってます。 へるぷみー Dim objWSHShell Set objWSHShell=WScript.CreateObject("WScript.Shell") objWSHShell.Run "cscript.exe d:\test.bat" objWSHShell=Nothing

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

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

専門家に質問してみよう