You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET调用SCHTASKS删任务报The process tried to write to a nonexistent pipe如何解决

问题原因

  • 报错本质是向已经提前终止的进程标准输入管道写入数据。你当前的实现绕了一层cmd进程,执行删除命令时,输入确认字符y的时序与cmd、schtasks进程的退出逻辑冲突,导致管道提前断开。
  • 手动执行命令时是人工控制输入节奏,不会出现时序错配问题,所以可以正常运行。

解决方案

最优修改方式(推荐)

直接调用schtasks.exe而非通过cmd中转,同时使用schtasks自带的/F参数跳过删除确认,无需额外输入y,彻底规避管道时序问题,修正后的代码如下:

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 sTime As String = teAutoRun.Time.ToString("HH:mm")
    Dim sCreateCmd As String = "/CREATE /SC DAILY /TN ""MyTasks\task"" /TR ""'" & My.Application.Info.DirectoryPath & "\program.exe' Auto"" /ST " & sTime & " /RL HIGHEST"
    Dim sDeleteCmd As String = "/DELETE /TN ""MyTasks\task"" /F" ' 加/F参数无需确认直接删除
    My.Settings.AutoRun = ceAutoRun.Checked

    ' 直接启动schtasks而非cmd
    Dim StartInfo As New System.Diagnostics.ProcessStartInfo With {
        .FileName = "schtasks.exe",
        .RedirectStandardOutput = True,
        .RedirectStandardError = True, ' 新增错误输出捕获方便后续排查问题
        .CreateNoWindow = True,
        .UseShellExecute = False
    }

    If My.Settings.AutoRun And Not My.Settings.AutoRunExists Then
        ' 仅执行创建
        StartInfo.Arguments = sCreateCmd
        Using p As Process = Process.Start(StartInfo)
            p.WaitForExit()
            ' 如需排查问题可读取输出:Dim output = p.StandardOutput.ReadToEnd()
        End Using
        My.Settings.AutoRunExists = True
    ElseIf My.Settings.AutoRun And My.Settings.AutoRunExists Then
        ' 先删旧任务再建新任务
        StartInfo.Arguments = sDeleteCmd
        Using p As Process = Process.Start(StartInfo)
            p.WaitForExit()
        End Using
        StartInfo.Arguments = sCreateCmd
        Using p As Process = Process.Start(StartInfo)
            p.WaitForExit()
        End Using
    Else
        ' 仅执行删除
        StartInfo.Arguments = sDeleteCmd
        Using p As Process = Process.Start(StartInfo)
            p.WaitForExit()
        End Using
        My.Settings.AutoRunExists = False
    End If

    My.Settings.Save()
End Sub

保留原有cmd中转写法的兼容修复

如果一定要保留原有逻辑,可通过调整时序避免管道提前断开:

  • 所有SW.WriteLine()执行后增加Threading.Thread.Sleep(100),等待进程处理输入
  • 在SW.WriteLine("exit")之后、关闭流之前增加myprocess.WaitForExit(),等待cmd进程完全退出

内容的提问来源于stack exchange,提问作者skipjack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:54:07