使用C#与控制台完全通信

时间:2017-01-30 23:42:45

标签: c# bots telegram

我正在使用C#和Telegram bot开发一个程序来控制我的VPS中的CMD。 Telegram bot和programm之间的连接工作得很好,所以这不是问题。 我想在同一个cmd窗口中从我的Telegram机器人编写命令。 要将字符串命令发送到cmd,我使用:

public static void Trythis(Message comando)
    {
        Process p = new Process();
        ProcessStartInfo info = new ProcessStartInfo();
        info.FileName = "cmd.exe";
        info.RedirectStandardInput = true;
        info.UseShellExecute = false;
        String output = String.Empty;
        p.StartInfo = info;
        p.Start();

        using (StreamWriter sw = p.StandardInput)
        {
            if (sw.BaseStream.CanWrite)
            {
                sw.WriteLine(comando.Text);

            }
        }
        using (StreamReader streamReader = p.StandardOutput)
        {
            output = streamReader.ReadToEnd();
            Bot.SendTextMessageAsync(comando.Chat.Id, output);
        }



    }
}

但是我在这部分得到了invalidOperationException:

        using (StreamReader streamReader = p.StandardOutput)
        {
            output = streamReader.ReadToEnd();
            Bot.SendTextMessageAsync(comando.Chat.Id, output);
        }

2 个答案:

答案 0 :(得分:1)

来自documentation

  

<强>出现InvalidOperationException 即可。

     

尚未为重定向定义StandardOutput流;确保ProcessStartInfo.RedirectStandardOutput设置为true,ProcessStartInfo.UseShellExecute设置为false。

     

(或)

     

已使用BeginOutputReadLine打开StandardOutput流以进行异步读取操作。

我认为你需要在开头添加这一行:

func loadData() {
    let query = PFQuery(className: "Noticias")
    query.whereKey("titulo", equalTo:"Es Navidad")
    query.findObjectsInBackground(block: { (objects : [PFObject]?, error: Error?) -> Void in
        if error == nil {
            // The find succeeded.
            print("Successfully retrieved \(objects!.count) scores.")

            // Do something with the found objects
            if let objects = objects {
                for object in objects {
                    print(object.objectId!)
                }
            }
        } else {
            // Log details of the failure
            print("bad day homie")
            print(error!)
        }
    })
}

答案 1 :(得分:0)

using块的结尾会在包装对象上调用Dispose() ...在第一次调用之后,您关闭并处理您的流