2015-11-07 3 views
0

Я пытаюсь понять это на протяжении большей части дня, и я не могу окунуться в эту проблему.Как открыть новую форму после завершения процесса в командной строке

У меня недостаточно знаний о предыдущем коде, но я пытаюсь исследовать, прежде чем пытаюсь что-то кодировать. У меня есть общее представление о том, как VB.net работает, но нужна помощь с моим кодом

Public Class Form1 
Dim CopyFrom As String 
Dim CopyTo As String 
Dim RoboCopyVariables As String 
Dim CopyS As String 
Dim CopyE As String 
Dim WaittimeTXT As String 
Dim WaitTime As String 
Dim RetryAttemptsTXT As String 
Dim RetryAttempts As String 
Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("CMD") 

Private Sub RunBTN_Click(sender As Object, e As EventArgs) Handles RunBTN.Click 
    CopyFrom = CopyFromTXT.Text 
    CopyTo = CopyToTXT.Text 
    'All of the selections for if CopyS has been checked 
    If CopySFoldersCB.Checked = True Then 
     CopyS = " /s" 
    ElseIf CopySFoldersCB.Checked = False Then 
     CopyS = "" 
    End If 
    If CopyEFoldersCB.Checked = True Then 
     CopyE = " /e" 
    ElseIf CopyEFoldersCB.Checked = False Then 
     CopyE = "" 
    End If 
    If WaitTimeCB.Checked = True Then 
     WaittimeTXT = WaitTimeTXT1.Text 
     WaitTime = " /w:" & WaittimeTXT 
    ElseIf WaitTimeCB.Checked = False Then 
     WaitTime = "" 
    End If 
    If RetryAttemptsCB.Checked = True Then 
     RetryAttemptsTXT = RetryAttempts1.Text 
     RetryAttempts = " /r:" & RetryAttemptsTXT 
    ElseIf RetryAttemptsCB.Checked = False Then 
     RetryAttempts = "" 
    End If 
    RoboCopyVariables = CopyS + CopyE + WaitTime + RetryAttempts 
    'CommandTest.Text = "/k robocopy " + CopyFrom + " " + CopyTo + "" + RoboCopyVariables 

    Process.Start("CMD", "/k robocopy " + CopyFrom + " " + CopyTo + "" + RoboCopyVariables) 

    For Each p As Process In pProcess 
     p.Kill() 
    Next 

    Form2.Show() 
    Me.Hide() 


End Sub 

Private Sub CancelButton_Click(sender As Object, e As EventArgs) Handles CancelButton.Click 
    Me.Close() 
    Form2.Close 
End Sub 
End Class 

Спасибо за помощь я получаю

+0

Вы не можете узнать, что оно будет выполнено, если вы используете параметр/k. Вместо этого используйте/c. Или запустите его напрямую, не используя cmd.exe. Используйте событие Process.Exited для обнаружения завершения, свойство Process.SynchronizingObject, чтобы оно запускалось в потоке пользовательского интерфейса. Do * not * kill все процессы cmd.exe, вы понятия не имеете, начали ли вы их. –

ответ

0

Во-первых, так как RoboCopy является приложением интерфейса командной строки (вещи, которые так называются «внешняя команда» в Batch), тогда вы должны вызывать ее напрямую, потому что нет необходимости вызывать командную строку Windows только для «размещения» другого приложения.

Во-вторых, для решения основной проблемы, которую вы имеете, вы можете использовать метод Process.WaitForExit, это заблокирует текущий поток, пока процесс не завершится.

Dim p As New Process 
p.StartInfo.FileName = "Robocopy.exe" 
p.StartInfo.Arguments = String.Format("""{0}"" ""{1}"" {2}", 
             CopyFrom, CopyTo, RoboCopyVariables) 

p.Start() 
p.WaitForExit(-1) 

Другим решением является для того, чтобы процесс поднять события затем подписаться на Process.Exited случае, это приведет к механизму без резьбы блокировки хорошо для асинхронных сценариев.

Public Class yourClassName 

    Friend WithEvents P As New Process 

    ' Call "Test" method somewhere... 
    Sub Test() 

     Dim copyFrom As String = ... 
     Dim copyTo As String = ... 
     Dim roboCopyVariables As String = ... 

     Me.P.EnableRaisingEvents = True 
     Me.P.StartInfo.FileName = "Robocopy.exe" 
     Me.P.StartInfo.Arguments = String.Format("""{0}"" ""{1}"" {2}", 
               copyFrom, copyTo, roboCopyVariables) 

     Me.P.Start() 
     ' Can do any thing here while asynchronouslly we wait for the process to exit... 

    End Sub 

    Private Sub P_Exited(ByVal sender As Object, ByVal e As EventArgs) _ 
    Handles P.Exited 

     ' Show the form here... 
     Form2.Show() 
     Me.Hide() 

    End Sub 

End Class 
+0

Спасибо за ваш ответ! При использовании кода, который вы поставили, я решил пойти со вторым решением. Хотя в настоящее время я получаю некоторые ошибки. Друг WithEvents P Как новый процесс Эта строка в частности. Я получаю ошибки для «Friend» и «WithEvents» Ошибки, которые я получаю, «недействительны для объявления локальной переменной – DaMrZ

+0

@DaMrZ« Друг »и/или« WithEvents »могут быть объявлены только вне блоков методов, просто объявите объект вне метода. Если вы все еще хотите объявить объект внутри блока метода, используйте 'Dim' (в одиночку), затем используйте оператор AddHandler', чтобы связать обработчик с событием' p.Exited': https://msdn.microsoft.com/ en-us/library/7taxzxka.aspx. Пожалуйста, подумайте о том, чтобы отметить ответ как принятый, если он решил проблему. – ElektroStudios

+0

Я объявил это вне метода, но теперь я получаю сообщение об ошибке «Ожидаемая заявка». для каждого P Также CopyFrom дает такую ​​же ошибку – DaMrZ

Смежные вопросы