iT邦幫忙

0

C#開啟cmd執行python的回傳值

  • 分享至 

  • xImage

各位晚安

如標題所言
我要在C#中調用python程式
並且可以成功調用,取得回傳值了
但回傳值卻是cmd全部的文字內容

程式碼如下

Process p = new Process();
            string cmd = @"cd C:\Users\Jack\Desktop\python\";
            string cmd2 = @"python test.py --subtype OK & exit";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.RedirectStandardInput = true;
            p.Start();
            StreamWriter myStreamWriter = p.StandardInput;
            myStreamWriter.WriteLine(cmd.ToString());
            myStreamWriter.WriteLine(cmd2.ToString());
            myStreamWriter.Close();
            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            p.Close();
            txtUrl.Text = output;

輸出內容如下:
Microsoft Windows 版本 10.0.17134.706 2018 Microsoft Corporation. 著作權所有,並保留一切權利。C:\Program Files (x86)\IIS Express>cd C:\Users\Jack\Desktop\python\C:\Users\Jack\Desktop\python>python test.py --subtype OK & exitOK

字串結尾處的確是有取得回傳值"OK"了
但卻連前面執行過程的文字都包含進來了

求好心人解答
感謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
舜~
iT邦高手 1 級 ‧ 2019-05-03 10:25:15

cmd有一個指令 'cls'(如果不是的話試試cln,clear...我忘了是什麼XD) 可以清空當前畫面,在輸出ok前先把畫面清除即可

另一個想法是
一行一行抓取,抓一行就捨棄前一行,抓到最後一行後再進行判斷內容~~~
您回傳的內容應該就那幾個(ok,1,0,false...),寫個regex去篩選判斷即可

0
Homura
iT邦高手 1 級 ‧ 2019-05-03 10:33:50

可以改成使用ReadLine()一次讀一行
使用EndOfStream來判斷是否讀到訊息結尾
然後前面2段不要輸出就好

int count = 0;
string output = "";
while (!p.StandardOutput.EndOfStream)
{
    output = p.StandardOutput.ReadLine();
    if (count > 1)
        Console.WriteLine(output);
    count++;
}

我要發表回答

立即登入回答