Share via

Visual basic 2019 robocopy cancel button

Brian 21 Reputation points
2021-02-09T07:48:17.82+00:00

Hello Oracles, I'm a noob and attempting to convert some robocopy commands into a basic VB 2019 forms application. I've got the basics working, copying files and folders from one location to another, but I can't work out the code to put behind the 'Cancel' button. When I quit the app, robocopy keeps going. Please help the noob - thanks.

Button1 starts the robocopy process that cannot be terminated.

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim srce01 As String = "\MyServer\MyShare"
Dim dest01 As String = "MyLocalDrive"
Dim MyProcess01 As Process
MyProcess01 = New Process
With MyProcess01.StartInfo
.FileName = "C:\Windows\SysWOW64\robocopy.exe"
.Arguments = srce01 & " " & dest01 & " *.docx /MIR /s"
.UseShellExecute = False
.CreateNoWindow = True
.RedirectStandardInput = False
.RedirectStandardOutput = False
.RedirectStandardError = True
End With
MyProcess01.Start()
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
     **need code here to kill the robocopy process**
End Sub

End Class

Developer technologies | Windows Forms
Developer technologies | VB
0 comments No comments

Answer accepted by question author

Adrian Bowles 86 Reputation points
2021-02-09T23:49:38.177+00:00

I believe it's a little more complicated as RoboCopy kicks of other process threads to copy files and killing the main process may eventually stop o copy or it may not.

There's a thread about it on stack overflow and I seem to recall the issue on large file copies where killing robocopy still continued copying these processes until they completed. Rather than terminating them.

https://stackoverflow.com/questions/44712364/batch-script-calling-robocopy-in-process-wont-terminate

So I think the key is to identify the child processes that are created, kill these and then kill the originating process.

Something like

    Sub KillProcessAndChildren(PID As Integer)
        Dim searcher As New ManagementObjectSearcher(String.Format("Select * From Win32_Process Where ParentProcessID={0}", PID))
        Dim moc As ManagementObjectCollection = searcher.Get()
        Try
            For Each mo In moc
                Try
                    KillProcessAndChildren(Convert.ToInt32(mo("ProcessID")))
                Catch ex As Exception
                    '//Don't worry as simply trying to kill all children
                End Try
            Next

            Dim proc = Process.GetProcessById(PID)
            proc.Kill()

        Catch ex As ArgumentException
            ' // Process already exited.
        End Try
    End Sub

For simple processes like Notepad - you can simply kill the process itself like KarenPayneOregon suggested

Was this answer helpful?


1 additional answer

Sort by: Most helpful
  1. Karen Payne MVP 35,606 Reputation points Volunteer Moderator
    2021-02-09T10:57:09.887+00:00

    See if this would work for you, here I'm opening a text file.

    Imports System.IO
    
    Public Class Form1
        Public Process As New Process()
    
        Public Sub ExecuteCommand(pCommandLineFile As String, Optional pArguments As String = "")
    
            Process.StartInfo.FileName = pCommandLineFile
    
            If Not String.IsNullOrWhiteSpace(pArguments) Then
                Process.StartInfo.Arguments = pArguments
            End If
    
            Process.StartInfo.CreateNoWindow = True
            Process.StartInfo.UseShellExecute = False
            Process.Start()
    
        End Sub
        Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
            Dim fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TextFile1.txt")
            ExecuteCommand("Notepad.exe", fileName)
        End Sub
        Private Sub KillButton_Click(sender As Object, e As EventArgs) Handles KillButton.Click
            Process.Kill()
        End Sub
    End Class
    

    Was this answer helpful?


Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.