5

Shell次の関数を使用して、VBA からバッチ スクリプトを起動しています。

myRes = Shell("myScript.cmd")

正常に実行されたかどうか、または実行エラーが発生したかどうかを知る方法はありますか?

4

2 に答える 2

5

ネイティブのシェル関数ではなく、 WshShellオブジェクトを試すことをお勧めします。

Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1 'or whatever suits you best
Dim errorCode As Integer

errorCode = wsh.Run("myScript.cmd", windowStyle, waitOnReturn)

If errorCode = 0 Then
    MsgBox "Execution successful. No error to report."
Else
    MsgBox "Program exited with error code " & errorCode & "."
End If    

ただし、次のことに注意してください。

が false (デフォルト) に設定されている場合bWaitOnReturn、Run メソッドはプログラムの開始直後に戻り、自動的に 0 を返します (エラー コードとして解釈されません)。

したがって、プログラムが正常に実行されたかどうかを検出するwaitOnReturnには、上記の例のように True に設定する必要があります。それ以外の場合は、何があってもゼロを返します。

私のこの以前の回答も役立つかもしれません。

于 2012-08-15T07:35:45.580 に答える
3

コマンドが成功時に 0 を返す場合は、エラー レベルをキャッチできます: http://www.devx.com/vb2themax/Tip/18663

プロセスの終了コードを取得する

場合によっては、特に VB アプリケーション内から MsDos バッチ ファイルを実行するときにERRORLEVEL、外部アプリケーションによってセットを決定することが必要になる場合があります。単純な Shell ステートメントではできませんが、GetProcessExitCodeAPI 関数のサポートにより、作業が簡単になります。

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As _
    Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As _
    Long, lpExitCode As Long) As Long
Const STILL_ACTIVE = &H103
Const PROCESS_QUERY_INFORMATION = &H400


Private Sub cmdRunNotepad_Click()
    Dim hTask As Long
    Dim hProcess As Long
    Dim exitCode As Long

    hTask = Shell("Notepad", vbNormalFocus)
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, hTask)

    ' loop until the process returns a valid exit code
    Do
        ' relinquish this CPU time slice
        Sleep 100
        DoEvents
        ' query for exit code
        GetExitCodeProcess hProcess, exitCode
    Loop While exitCode = STILL_ACTIVE

    MsgBox "Exit code = " & exitCode, vbInformation


End Sub

フランチェスコ・バレナ

または、次のようなことを試すことができます。

myRes = Shell("cmd /c myScript.cmd&&echo success")

条件付き実行に関する詳細はこちら: http://www.robvanderwoude.com/condexec.php

ただし、どちらの場合も、終了コードに依存しています。

于 2012-08-14T09:26:28.313 に答える