Search code examples
vb.netcmdwindows-task-scheduler

The process tried to write to a nonexistent pipe vb.net


I'm currently writing a sub in vb.net that is supposed to create and/or erase tasks in the task scheduler that comes with windows 10. The creation part works fine, but when I try to erase the task I get this error in the visual studio console: "The process tried to write to a nonexistent pipe", and the task is (of course) still there. I've looked for a solution but can't find anything similar. Here is the code:

Private Sub SimpleButton2_Click(sender As Object, e As EventArgs) Handles sbAutoRun.Click

  Dim CMDThread As New Threading.Thread(AddressOf CMDAutomate)
  CMDThread.Start()

End Sub

Private Sub CMDAutomate()

  Dim myprocess As New Process
  Dim StartInfo As New System.Diagnostics.ProcessStartInfo
  Dim sTime As String = teAutoRun.Time.ToString("HH:mm")
  Dim sCmdCommand As String = "SCHTASKS /CREATE /SC DAILY /TN ""MyTasks\task"" /TR ""'" & My.Application.Info.DirectoryPath & "\program.exe' Auto"" /ST " & sTime & " /RL HIGHEST"
  Dim sCmdCommand2 As String = "SCHTASKS /DELETE /TN ""MyTasks\task"""
  My.Settings.AutoRun = ceAutoRun.Checked

  StartInfo.FileName = "cmd" 'starts cmd window
  StartInfo.RedirectStandardInput = True
  StartInfo.RedirectStandardOutput = True
  StartInfo.CreateNoWindow = True '<---- if you want to not create a window
  StartInfo.UseShellExecute = False 'required to redirect
  myprocess.StartInfo = StartInfo
  myprocess.Start()
  Dim SR As System.IO.StreamReader = myprocess.StandardOutput
  Dim SW As System.IO.StreamWriter = myprocess.StandardInput
  If My.Settings.AutoRun And Not My.Settings.AutoRunExists Then
    SW.WriteLine(sCmdCommand)
    My.Settings.AutoRunExists = True
    Console.WriteLine(sCmdCommand)
  ElseIf My.Settings.AutoRun And My.Settings.AutoRunExists Then
    SW.WriteLine(sCmdCommand2)
    SW.WriteLine("y")
    SW.WriteLine(sCmdCommand)
  Else
    SW.WriteLine(sCmdCommand2)
    SW.WriteLine("y")
    My.Settings.AutoRunExists = False
    Console.WriteLine(sCmdCommand2)
  End If
  SW.WriteLine("exit") 'exits command prompt window
  SW.Close()
  SR.Close()
  My.Settings.Save()

End Sub

Thanks..

Ps: The commands work fine when entered by hand in the cmd.


Solution

  • Update: Changed this

    sCmdCommand2 As String = "SCHTASKS /DELETE /TN ""MyTasks\task"""
    
    SW.WriteLine(sCmdCommand2)
    SW.WriteLine("y")
    

    and wrote it like this

    sCmdCommand2 As String = "SCHTASKS /DELETE /TN ""MyTasks\task"" /F"
    
    SW.WriteLine(sCmdCommand2)
    

    Now it works fine.