気ままに、あいてー 雑記帳 - Shellの実行完了を待つ
VB、VBAからShellを使用してDOSコマンド等を実行した場合、
実行完了を待たないで次のステートメントが実行されてしまう。
実行完了を待ちたい時がある。
Windows Script Host→Run メソッド
新しいプロセス内でプログラムを実行します。
Runメソッドは新しいWindowsプロセス内でプログラムの実行を開始します。スクリプト内の次の処理に進まずにプログラムの実行が終了するまでスクリプトを待機させることができます。これにより、スクリプトとプログラムを同期させて実行できます。
【サンプル】
コマンド ウィンドウを開き、パスを C:\ に変更し、DIR コマンドを実行する例です。
Dim oShell
Set oShell = WScript.CreateObject ("WSCript.shell")
oShell.run "cmd /K CD C:\ & Dir"
Set oShell = Nothing
SoftICEのは何ですか?
参考
DOS コマンドの実行結果を取得する方法
【抜粋】
次のコードは、XCOPY コマンドによるコピーが完了するのを待機してから、db1.mdb を起動します。
Dim oShell As Object
Set oShell = CreateObject("WScript.Shell")
oShell.Run "%ComSpec% /c XCOPY C:\Bkup %temp%\Bkup", , True
Set oShell = Nothing
Call Shell("MSACCESS.EXE " & Environ$("temp") & "\Bkup\db1.mdb", vbNormalFocus)
Runメソッドの第3引数WaitOnReturnにTrueを指定することによって、同期実行(プロセスの完了を待機)になります。
また Runメソッドのコマンド中では環境変数が使えるので、Environ$関数を使わずに直接「%ComSpec%」でコマンドインタープリタを指定しています。
mljjghf.dllを削除する方法
さて、本題です。
DOSコマンドの実行結果をダイレクトに取得するには、Windows Scripting HostライブラリのWshShellオブジェクトのExecメソッドを使います。
標準モジュールに以下のような汎用関数を用意しましょう。
Sunは、Solaris 10でCコンパイラを設定する方法
' 関数名:ExecCommand
' 目 的:DOS コマンドの実行結果を取得します。
' 戻り値:エラーの有無を Boolean 型で返します。
' エラー発生時は True、正常終了時は False です。
' 引 数:sCommand-> 必須/入力用です。実行コマンドを文字列型で渡します。
' sResult -> 必須/出力用です。実行結果を文字列型で受け取ります。
' 失敗した場合はエラー内容を示します。
' 注 意:実行中はコマンドプロンプト ウィンドウが開きます。
' また実行後は自動的にウィンドウが閉じます。
Public Function ExecCommand(sCommand As String, sResult As String) _
As Boolean
' 変数宣言部
Dim oShell As Object, oExec As Object
' オブジェクト変数に参照をセットします。
Set oShell = CreateObject("WScript.Shell")
Set oExec = oShell.Exec("%ComSpec% /c " & sCommand)
' 処理完了を待機します。
Do Until oExec.status: DoEvents: Loop
' 戻り値をセットします。
If Not oExec.StdErr.AtEndOfStream Then
ExecCommand = True
sResult = oExec.StdErr.ReadAll
ElseIf Not oExec.StdOut.AtEndOfStream Then
sResult = oExec.StdOut.ReadAll
End If
' オブジェクト変数の参照を解放します。
Set oExec = Nothing: Set oShell = Nothing
End Function
0 コメント:
コメントを投稿