Dustray 2015-11-18 09:04 采纳率: 0%
浏览 584

c#运行批处理语句第一句成功第二句失败

运行第一句批处理成功得到了PID,想利用PID再执行第二局批处理就不行了,是IO流的原因吗?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string getPID = "taskkill /im YoukuDesktop.exe /f";
        string useNTSD = "ntsd /p ";
        Process myPro = new Process();
        myPro.StartInfo.FileName = "cmd.exe";//打开DOS控制平台 
        myPro.StartInfo.UseShellExecute = false;
        myPro.StartInfo.CreateNoWindow = false;//是否显示DOS窗口,true代表隐藏;
        myPro.StartInfo.RedirectStandardInput = true;
        myPro.StartInfo.RedirectStandardOutput = true;
        myPro.StartInfo.RedirectStandardError = true;
        myPro.Start();
        StreamWriter sIn = myPro.StandardInput;//标准输入流 
        sIn.AutoFlush = true;
        StreamReader sOut = myPro.StandardOutput;//标准输出流 
        StreamReader sErr = myPro.StandardError;//标准错误流 
        sIn.Write(getPID + System.Environment.NewLine);//DOC命令
        sIn.Write("exit" + System.Environment.NewLine);//第四条DOS命令,退出DOS窗口

        string s = sOut.ReadToEnd();//读取执行DOS命令后输出信息 
        string er = sErr.ReadToEnd();//读取执行DOS命令后错误信息 
        int position = s.IndexOf("PID 为 ");
        if (myPro.HasExited == false)
        {
            myPro.Kill();
            MessageBox.Show(er);
        }
        else
        {
            label1.Text = position.ToString() ;
            s = s.Remove(0,position+6);
            s = s.Substring(0, 6);
            s = Regex.Replace(s, @"[^\d]*", "");
            textBox1.Text = "PIN码是:"+s;
        }
        useNTSD = useNTSD + s;
        //--------------------------------------------------------------------------------------------
        sIn.Write(useNTSD + System.Environment.NewLine);//DOC命令
        sIn.Write("exit" + System.Environment.NewLine);//第四条DOS命令,退出DOS窗口
        string s2 = sOut.ReadToEnd();//读取执行DOS命令后输出信息 
        string er2 = sErr.ReadToEnd();//读取执行DOS命令后错误信息 
        if (myPro.HasExited == false)
        {
            myPro.Kill();
            MessageBox.Show(er2);
        }
        else
        {
            textBox2.Text = s2;
        }
            sIn.Close();
        sOut.Close();
        sErr.Close();
        myPro.Close();
    }
}
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-04 19:51
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的C#程序中,你尝试使用Process对象来执行两个不同的批处理命令。第一个命令(getPID)用于获取一个进程的PID,并将其写入到文本框 textBox1 中。第二个命令(useNTSD)用于设置另一个批处理命令。

    但是,在第二个命令之后,当你尝试关闭Process对象时,由于没有指定正确的关闭方法,所以无法正确地关闭这个过程。

    你应该使用Process对象的Close()方法来确保所有相关资源都被释放。如果你不这样做,那么当第二个命令完成后,系统可能会继续等待最后一个命令完成,这可能导致多个命令同时运行而引发问题。

    此外,你应该注意,即使Process对象已经关闭,它仍然可能保留一些未清理的资源,比如文件描述符、内存等。因此,你需要检查这些资源是否已经被正确释放。

    最后,请记住,直接修改Process对象的方法(例如Write()ReadToEnd())可能会导致意外的行为,因为它们可以影响整个进程的状态。在这种情况下,最好总是使用Process对象提供的API,除非你知道你在做什么并且确信这是必要的。

    评论

报告相同问题?