2012年5月5日土曜日

気ままに、あいてー 雑記帳 - 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



These are our most popular posts:

[AC95] Shell関数を用いて DOS のコマンドを実行する方法

2003年5月7日 ... Shell 関数を利用して、MS - DOS の DIR、COPY、DEL 等のコマンドを実行する方法を 紹介します。 ■ 解説 Shell 関数は、引き数 commandstring に拡張子が EXE、COM、 BAT または PIF の 実行形式のファイルを指定しなければなりませ ... read more

UNIXシェルスクリプトメモ(Hishidamas UNIX shell script Memo)

UNIXのコマンドをファイルに書いておき、バッチとして実行することが出来る。 ... スクリプトの中で環境変数を設定した場合、現在のシェルの環境にも影響する( スクリプトの中で定義した環境変数が実行元 ... →MS-DOSでバッチファイルの場所を 取得する方法 ... read more

VBA:VBAからDOSのコマンドを実行する方法 - 覚書 - My Knowledge ...

2007年2月19日... したい場合には、「WScript.Shell」オブジェクトを生成してRunメソッドでDOSコマンド を指定すればよい。 以下にVBAからMS-DOSのコマンドを実行するサンプルを記述。 ... Home VBA共通 VBA:VBAからDOSのコマンドを実行する方法 ... read more

Excel VBA Tips[MS-DOSコマンドの標準出力を取得する - Office TANAKA

と言われそうですが、今回はMS-DOSコマンドの標準出力を変数に取得する方法を解説 します。これはもう、Excelとは ... VBやVBAからMS-DOSコマンドを実行するときには、 問題が2つあります。1つめはShell関数で起動できないことです。MS-DOSコマンドは ... read more

Related Posts



0 コメント:

コメントを投稿