programing

셸 명령이 완료될 때까지 기다립니다.

javamemo 2023. 4. 10. 20:50
반응형

셸 명령이 완료될 때까지 기다립니다.

Excel VBA에서 다음과 같이 지정된 디렉토리에서 배치 파일을 실행하는 간단한 셸 명령을 실행하고 있습니다.

Dim strBatchName As String
strBatchName = "C:\folder\runbat.bat"
Shell strBatchName

일부 시스템에서는 배치 파일을 실행하는 데 시간이 오래 걸릴 수 있으며, 실행을 완료하기 위해 배치 파일에 종속된 진행 중인 VBA 코드가 있습니다.다음과 같이 대기 타이머를 설정할 수 있습니다.

Application.Wait Now + TimeSerial(0, 0, 5)

그러나 너무 느린 일부 컴퓨터에서는 작동하지 않을 수 있습니다.셸 실행이 완료될 때까지 나머지 VBA 코드를 진행하도록 Excel에게 체계적으로 지시할 수 있는 방법이 있습니까?

WScript 를 사용합니다.대신 셸을 사용합니다.waitOnReturn옵션:

Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1

wsh.Run "C:\folder\runbat.bat", windowStyle, waitOnReturn

(Shell이 완료될 때까지 기다린 후 셀 포맷 - 명령을 동기적으로 실행하는 아이디어)

다음 서브를 추가합니다.

Sub SyncShell(ByVal Cmd As String, ByVal WindowStyle As VbAppWinStyle)
VBA.CreateObject("WScript.Shell").Run Cmd, WindowStyle, True
End Sub

참조를 추가할 경우C:\Windows\system32\wshom.ocx다음 항목도 사용할 수 있습니다.

Sub SyncShell(ByVal Cmd As String, ByVal WindowStyle As VbAppWinStyle)
Static wsh As New WshShell
wsh.Run Cmd, WindowStyle, True
End Sub

이 버전이 더 효율적일 것입니다.

배트 파일을 "C:\"에 저장합니다.WINDOWS\system32"로 동작하고 있는 코드 아래를 사용합니다.

   Dim wsh As Object
   Set wsh = VBA.CreateObject("WScript.Shell")
   Dim waitOnReturn As Boolean: waitOnReturn = True
   Dim windowStyle As Integer: windowStyle = 1
   Dim errorCode As Integer

   errorCode = wsh.Run("runbat.bat", windowStyle, waitOnReturn)

If errorCode = 0 Then
    'Insert your code here
Else
    MsgBox "Program exited with error code " & errorCode & "."
End If   

이게 내가 가지고 있던 거야VB프로세스가 완료될 때까지 기다린 후 계속 진행합니다.나는 이것을 쓰지 않았고 신용을 받지 않는다.

다른 오픈 포럼에서 제공되어 매우 효과적입니다.

다음 선언이 필요합니다.RunShell서브루틴:

Option Explicit

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

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const PROCESS_QUERY_INFORMATION = &H400

Private Const STATUS_PENDING = &H103&

'then in your subroutine where you need to shell:

RunShell (path and filename or command, as quoted text)

실행 명령어 괄호 변경으로 제안하신 내용은 VBA에서 정상적으로 동작했습니다.

Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
Dim errorCode As Integer
wsh.Run "C:\folder\runbat.bat", windowStyle, waitOnReturn

셸을 객체에 링크하고 배치 작업을 통해 셸 개체(예: 셸 개체)를 종료하고 셸 개체 = 아무것도 없는 경우 VBA 코드가 계속되도록 합니다.

또는 VBA의 셸 명령에서 출력 값을 캡처할 수 있는지 확인하십시오.

새로운 wshell처럼 dim wsh

chdir "배치 파일 디렉토리"

wsh.run "배치 파일의 풀패스", vbnormalfocus, true

완료 아들

언급URL : https://stackoverflow.com/questions/15951837/wait-for-shell-command-to-complete

반응형