Hỏi vê lệnh "Call Shell" trong macro (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

AoiSora

Thành viên mới
Tham gia
10/2/17
Bài viết
10
Được thích
1
Xin chào mọi người,

Hiện nay mình đang gặp 1 vấn đề mong mọi người giúp đỡ.
Mình có sử dụng lệnh "Call Shell("cmd.exe /S /K" & command)" trong macro để gọi và thực hiện 1 số lệnh trong dos.
Nhưng mình không tìm được cách nào để xác định việc call và chạy các lệnh này đã kết thúc chưa để thực hiện tiếp các lệnh khác bên dưới.
Nếu mình viết luôn các lệnh ngay dưới lệnh call này thì xảy ra trường hợp là lệnh bên dos chưa chay xong mà chương trình đã thực hiện các lệnh này rồi.

Mọi người có giải pháp nào xin chỉ giúp.

Thanks
 
Xin chào mọi người,

Hiện nay mình đang gặp 1 vấn đề mong mọi người giúp đỡ.
Mình có sử dụng lệnh "Call Shell("cmd.exe /S /K" & command)" trong macro để gọi và thực hiện 1 số lệnh trong dos.
Nhưng mình không tìm được cách nào để xác định việc call và chạy các lệnh này đã kết thúc chưa để thực hiện tiếp các lệnh khác bên dưới.
Nếu mình viết luôn các lệnh ngay dưới lệnh call này thì xảy ra trường hợp là lệnh bên dos chưa chay xong mà chương trình đã thực hiện các lệnh này rồi.

Mọi người có giải pháp nào xin chỉ giúp.

Thanks
Cái này hình như mới này. Bạn có thể nêu rõ vấn đề để các thầy vào giúp đỡ, để mọi người học hỏi tý được không
 
Upvote 0
Mã:
Const OC_RUNTIME     As String = "c:\OpenCobol_bin"
Const esqlOC_RUNTIME As String = "C:\esqlOC"
Const COB_CFLAGS     As String = "-I " & OC_RUNTIME
Const COB_CONFIG_DIR As String = OC_RUNTIME & "\config\"
Const COB_LIBS       As String = OC_RUNTIME & "\libcob.lib " & OC_RUNTIME & "\mpir.lib " & esqlOC_RUNTIME & "\ocsql.lib"
Const VC_PATH        As String = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\"

Sub main()
    Dim f As String
    Dim FileSource As String 'file source
    Dim FileName   As String 'file source name
    Dim FilePath   As String 'path file source
    Dim FileCOB    As String 'file COB name
    Dim FileEXE    As String 'file EXE name
    Dim FileLOG    As String 'file Log

    
    f = Application.GetOpenFilename(Title:="Select Source File")
    
    'Exit if cancel is selected
    If f = "False" Then Exit Sub
    
    'Find Filename
    FileSource = Dir(f, vbDirectory)
    FilePath = Left(f, InStrRev(f, "\"))
    'MsgBox FilePath
    FileName = Mid(FileSource, 1, InStrRev(FileSource, ".") - 1)
    'MsgBox "FileName: [" & FileName & "]"
    FileCOB = FilePath & FileName & ".cob"
    FileEXE = FilePath & FileName & ".exe"
    FileLOG = FilePath & FileName & ".log"
    Dim command As String
    
    'MAKE SOURCE
    command = "SET COB_CFLAGS=" & COB_CFLAGS & "&" _
              & "SET COB_LIBS=" & COB_LIBS & "&" _
              & "SET COB_CONFIG_DIR=" & COB_CONFIG_DIR & "& " _
              & esqlOC_RUNTIME & "\esqlOC.exe -static -o " & FileCOB & " " & f & " & " _
              & "call ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat""" & " & " _
              & "pushd " & OC_RUNTIME & " & " _
              & "cobc.exe -fixed -v -x -static -o " & FileEXE & " " & FileCOB & " & " _
              & "exit"
  
    Call Shell("cmd.exe /S /K" & command, vbNormalFocus)
    
    'RUN SOURCE
    'command = "PATH=" & OC_RUNTIME & ";" & esqlOC_RUNTIME & "&" _
    '          & FileEXE & " >> " & FileLOG
    'MsgBox command
    'Call Shell("cmd.exe /S /K" & command)
End Sub
Ví dụ trên đây là đoạn code mình đang debug.
Nội dung đại ý là sẽ mình sẽ execute 1 file sourcecode thành file exe sau đó sẽ run file exe này.
Phần "MAKE SOURCE" chính là phần mình execute ra file exe bằng cách dùng lệnh "call shell".
Vấn đề của mình là không xác định được khi nào chương trình sẽ execute xong phần "MAKE SOURCE" để chạy phần "RUN SOURCE" bên dưới.
 
Upvote 0
Xin chào mọi người,

Hiện nay mình đang gặp 1 vấn đề mong mọi người giúp đỡ.
Mình có sử dụng lệnh "Call Shell("cmd.exe /S /K" & command)" trong macro để gọi và thực hiện 1 số lệnh trong dos.
Nhưng mình không tìm được cách nào để xác định việc call và chạy các lệnh này đã kết thúc chưa để thực hiện tiếp các lệnh khác bên dưới.
Nếu mình viết luôn các lệnh ngay dưới lệnh call này thì xảy ra trường hợp là lệnh bên dos chưa chay xong mà chương trình đã thực hiện các lệnh này rồi.

Mọi người có giải pháp nào xin chỉ giúp.

Thanks
Thay vì dùng Shell, bạn thử cái này:
Mã:
CreateObject("Wscript.Shell").Run Command, WindowStyle, WaitOnReturn
Trong đó cần chú ý 2 chỗ:
- Command: là lệnh của bạn
- WaitOnReturn: Nếu =True thì nó sẽ đợi Command thực thi xong mới tiếp tục các lệnh bên dưới
Ví dụ:
Mã:
sPath = "gì gì đó"
sComm = "DIR " & sPath & " /ON /B /AD/S >" & tmpFile
CreateObject("Wscript.Shell").Run "cmd /u /c " & sComm, 0, True
Đoạn code trên sẽ thực thi lệnh DOS để liệt kê các tên file có trong sPath và cho vào trong tmpFile
 
Upvote 0
Thay vì dùng Shell, bạn thử cái này:
Mã:
CreateObject("Wscript.Shell").Run Command, WindowStyle, WaitOnReturn
Trong đó cần chú ý 2 chỗ:
- Command: là lệnh của bạn
- WaitOnReturn: Nếu =True thì nó sẽ đợi Command thực thi xong mới tiếp tục các lệnh bên dưới
Ví dụ:
Mã:
sPath = "gì gì đó"
sComm = "DIR " & sPath & " /ON /B /AD/S >" & tmpFile
CreateObject("Wscript.Shell").Run "cmd /u /c " & sComm, 0, True
Đoạn code trên sẽ thực thi lệnh DOS để liệt kê các tên file có trong sPath và cho vào trong tmpFile

Em cám ơn anh.
Em đã thực hiện thành công
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom