Dos Commands Don't Wait for finish
CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 9 of 9

Thread: Dos Commands Don't Wait for finish

  1. #1
    Join Date
    Dec 2008
    Posts
    7

    Dos Commands Don't Wait for finish

    Seems they all run at once. I am a super-noob at this so my code is simple... How can I get multiple commands to run one after the other?

    I have googled the heck out of this, but the code I see looks nothing like mine....:


    Public Class ChangeDesktop
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim User As String
    User = TextUser.Text
    Dim File As String
    File = TextFile.Text
    Shell("cmd /c " & "attrib -r " & "c:\docume~1\" & User & "\locals~1\temp\Echowall.bmp")

    Shell("cmd /c " & "del" & "c:\docume~1\" & User & "\locals~1\temp\Echowall.bmp")

    Shell("cmd /c " & "rename" & File & "Echowall.bmp")

    Shell("cmd /c " & "move /y echowall.bmp " & "c:\docume~1\" & User & "\locals~1\temp\")

    Shell("cmd /c " & "attrib +r" & "c:\docume~1\" & User & "\locals~1\temp\Echowall.bmp")

    Message.Show()
    End Sub
    End Class

  2. #2
    Join Date
    Aug 2003
    Location
    Sydney, Australia
    Posts
    1,853

    Re: Dos Commands Don't Wait for finish


  3. #3
    Join Date
    Jan 2006
    Location
    Chicago, IL
    Posts
    14,981

    Re: Dos Commands Don't Wait for finish

    Using Windows? This is even easier:

    Code:
    Starts a separate window to run a specified program or command.
    
    START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
          [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
          [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
          [parameters]
    
        "title"     Title to display in  window title bar.
        path        Starting directory
        B           Start application without creating a new window. The
                    application has ^C handling ignored. Unless the application
                    enables ^C processing, ^Break is the only way to interrupt
                    the application
        I           The new environment will be the original environment passed
                    to the cmd.exe and not the current environment.
        MIN         Start window minimized
        MAX         Start window maximized
        SEPARATE    Start 16-bit Windows program in separate memory space
        SHARED      Start 16-bit Windows program in shared memory space
        LOW         Start application in the IDLE priority class
        NORMAL      Start application in the NORMAL priority class
        HIGH        Start application in the HIGH priority class
        REALTIME    Start application in the REALTIME priority class
        ABOVENORMAL Start application in the ABOVENORMAL priority class
        BELOWNORMAL Start application in the BELOWNORMAL priority class
        AFFINITY    The new application will have the specified processor
                    affinity mask, expressed as a hexadecimal number.
        WAIT        Start application and wait for it to terminate
        command/program
                    If it is an internal cmd command or a batch file then
                    the command processor is run with the /K switch to cmd.exe.
                    This means that the window will remain after the command
                    has been run.
    
                    If it is not an internal cmd command or batch file then
                    it is a program and will run as either a windowed application
                    or a console application.
    
        parameters  These are the parameters passed to the command/program
    
    NOTE: The SEPERATE and SHARED options are not supported on 64-bit platforms.
    
    If Command Extensions are enabled, external command invocation
    through the command line or the START command changes as follows:
    
    non-executable files may be invoked through their file association just
        by typing the name of the file as a command.  (e.g.  WORD.DOC would
        launch the application associated with the .DOC file extension).
        See the ASSOC and FTYPE commands for how to create these
        associations from within a command script.
    
    When executing an application that is a 32-bit GUI application, CMD.EXE
        does not wait for the application to terminate before returning to
        the command prompt.  This new behavior does NOT occur if executing
        within a command script.
    
    When executing a command line whose first token is the string "CMD "
        without an extension or path qualifier, then "CMD" is replaced with
        the value of the COMSPEC variable.  This prevents picking up CMD.EXE
        from the current directory.
    
    When executing a command line whose first token does NOT contain an
        extension, then CMD.EXE uses the value of the PATHEXT
        environment variable to determine which extensions to look for
        and in what order.  The default value for the PATHEXT variable
        is:
    
            .COM;.EXE;.BAT;.CMD
    
        Notice the syntax is the same as the PATH variable, with
        semicolons separating the different elements.
    
    When searching for an executable, if there is no match on any extension,
    then looks to see if the name matches a directory name.  If it does, the
    START command launches the Explorer on that path.  If done from the
    command line, it is the equivalent to doing a CD /D to that path.
    David

    CodeGuru Article: Bound Controls are Evil-VB6
    2013 Samples: MS CODE Samples

    CodeGuru Reviewer
    2006 Dell CSP
    2006, 2007 & 2008 MVP Visual Basic
    If your question has been answered satisfactorily, and it has been helpful, then, please, Rate this Post!

  4. #4
    Join Date
    Jan 2003
    Location
    7,107 Islands
    Posts
    2,487

    Re: Dos Commands Don't Wait for finish

    you may use the Process class, have a look http://www.codeguru.com/forum/showthread.php?t=465697 it is in c# though but you could easily convert it to vb.

    you may also compile those commands into a single BAT file, and then execute the BAT file with the Process object.

    hth
    Busy

  5. #5
    Join Date
    Jan 2006
    Location
    18 32' N / 73 52' E
    Posts
    416

    Re: Dos Commands Don't Wait for finish

    You can use Process class and track for the events raised by it when a process is finished.
    Then run another process. Continue this untill all are completed.

  6. #6
    Join Date
    Mar 2007
    Location
    Argentina
    Posts
    579

    Re: Dos Commands Don't Wait for finish

    Quote Originally Posted by MaxDes View Post
    Seems t...
    End Class
    Walk this way:
    Code:
        Public Function ExecCommand(ByRef CommandLine As String, _
                                    Optional ByRef Arguments As String = "", _
                                    Optional ByRef Wait*****it As Boolean = True) As Integer
            Dim psi As New ProcessStartInfo()
            Dim p As Process
    
            With psi
                .FileName = CommandLine
                .Arguments = Arguments 
                .WindowStyle = ProcessWindowStyle.Hidden 'This avoid a text window being opened
            End With
            Try
                p = Process.Start(psi) 'This line runs the command
                if Wait*****it  then p.Wait*****it () 'This wait until the command ends
                Return p.ExitCode
            Catch e As System.Exception
                'Catch errors here
            End Try
        End Function
    
        Public Class ChangeDesktop
            Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                Dim User As String
                User = TextUser.Text
                Dim File As String
                File = TextFile.Text
                ExecCommand("cmd", " /c " & "attrib -r " & "c:\docume~1\" & User & "\locals~1\temp\Echowall.bmp", Wait*****it:=True)
                ExecCommand("cmd", " /c " & "del" & "c:\docume~1\" & User & "\locals~1\temp\Echowall.bmp", Wait*****it:=True)
                ExecCommand("cmd", " /c " & "rename" & File & "Echowall.bmp", Wait*****iit:=True)
                ExecCommand("cmd", " /c " & "move /y echowall.bmp " & "c:\docume~1\" & User & "\locals~1\temp", Wait*****it:=True)
                ExecCommand("cmd", " /c " & "attrib +r" & "c:\docume~1\" & User & "\locals~1\temp\Echowall.bmp", Wait*****it:=True)
    
                Message.Show()
            End Sub
        End Class
    Note: A bug in the codeguru engine replaces the text "Wait For Exit" (without spaces) with the text Wait*****it
    Last edited by Marraco; December 4th, 2008 at 07:02 AM. Reason: ByVal replaced for ByRef because is readonly, so increase performance
    [Vb.NET 2008 (ex Express)]

  7. #7
    Join Date
    Dec 2008
    Posts
    7

    Re: Dos Commands Don't Wait for finish

    Public Function ExecCommand(ByRef CommandLine As String, _
    Optional ByRef Arguments As String = "", _
    Optional ByRef Wait*****it As Boolean = True) As Integer

    Gives me the following error:
    Statement is not Valid in a Namespace

    ExecCommand("cmd", " /c " & "attrib -r " & "c:\docume~1\" & User & "\locals~1\temp\Echowall.bmp", Wait*****it:=True)

    All lines with "execcommand" give me the following error:

    name "execcommand" is not declared.

    Any idea why?


    nevermind I figured it out and changed the code as such:

    Public Class ChangeDesktop
    Public Function ExecCommand(ByRef CommandLine As String, _
    Optional ByRef Arguments As String = "", _
    Optional ByRef Wait*****it As Boolean = True) As Integer
    Dim psi As New ProcessStartInfo()
    Dim p As Process

    With psi
    .FileName = CommandLine
    .Arguments = Arguments
    .WindowStyle = ProcessWindowStyle.Hidden 'This avoid a text window being opened
    End With
    Try
    p = Process.Start(psi) 'This line runs the command
    If Wait*****it Then p.Wait*****it() 'This wait until the command ends
    Return p.ExitCode
    Catch e As System.Exception
    'Catch errors here
    End Try
    End Function


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim User As String
    User = TextUser.Text
    Dim File As String
    File = TextFile.Text
    ExecCommand("cmd", " /c " & "attrib -r " & "c:\docume~1\" & User & "\locals~1\temp\Echowall.bmp", Wait*****it:=True)
    ExecCommand("cmd", " /c " & "del" & "c:\docume~1\" & User & "\locals~1\temp\Echowall.bmp", Wait*****it:=True)
    ExecCommand("cmd", " /c " & "rename" & File & "Echowall.bmp", Wait*****it:=True)
    ExecCommand("cmd", " /c " & "move /y echowall.bmp " & "c:\docume~1\" & User & "\locals~1\temp", Wait*****it:=True)
    ExecCommand("cmd", " /c " & "attrib +r" & "c:\docume~1\" & User & "\locals~1\temp\Echowall.bmp", Wait*****it:=True)

    Message.Show()
    End Sub
    End Class

    Going to test it now. Thank you all for your input this community is awesome!
    Last edited by MaxDes; December 4th, 2008 at 10:06 AM.

  8. #8
    Join Date
    Mar 2007
    Location
    Argentina
    Posts
    579

    Re: Dos Commands Don't Wait for finish

    Quote Originally Posted by MaxDes View Post
    Public Function ExecCommand(ByRef CommandLine As String, _
    Optional ByRef Arguments As String = "", _
    Optional ByRef Wait*****it As Boolean = True) As Integer

    Gives me the following error:
    Statement is not Valid in a Namespace

    ExecCommand("cmd", " /c " & "attrib -r " & "c:\docume~1\" & User & "\locals~1\temp\Echowall.bmp", Wait*****it:=True)

    All lines with "execcommand" give me the following error:

    name "execcommand" is not declared.

    Any idea why?
    My mistake. execcommand is an already .NET command. Use other name. Also don't write Wait*****it. See the red message I had written.
    [Vb.NET 2008 (ex Express)]

  9. #9
    Join Date
    Mar 2007
    Location
    Argentina
    Posts
    579

    Re: Dos Commands Don't Wait for finish

    Quote Originally Posted by MaxDes View Post
    Public Function ExecCommand(ByRef CommandLine As String, _
    Optional ByRef Arguments As String = "", _
    Optional ByRef Wait*****it As Boolean = True) As Integer
    ...
    MaxDes: when you post code, select it, and click on the button "#" (see imagehttp://www.codeguru.com/forum/attach...1&d=1228412016), to enclose the code with [CODE*][/*CODE] tags. it makes the code much more easy to read.
    Attached Images Attached Images  
    [Vb.NET 2008 (ex Express)]

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  


Azure Activities Information Page

Windows Mobile Development Center


Click Here to Expand Forum to Full Width

This is a CodeGuru survey question.


Featured


HTML5 Development Center