C#使用程式呼叫bash,不斷往bash內插入命令並執行

薛小謙發表於2022-04-26

呃呃呃,遇到了一個非常噁心得問題,現在就是,有幾十萬條資料需要當作引數呼叫python指令碼

一次一次輸入命令過去緩慢,經過了多層考慮決定使用程式來解決(不知道執行緒怎麼開啟bash得)

原理非常簡單,類似與開啟一個cmd視窗不斷地往cmd視窗內寫入命令

引數如下:

bashCount:開啟程式個數,也就是啟動bash數量

command:命令

     public static void CreateBash(int bashCount, List<string> command)
        {
            try
            {
                var data = Convert.ToInt32(Math.Ceiling((double)command.Count / bashCount));
                Parallel.For(0, bashCount, (i) =>
                {
                    Process p = new Process();
                    //設定要啟動的應用程式
                    p.StartInfo.FileName = "bash";
                    //是否使用作業系統shell啟動
                    p.StartInfo.UseShellExecute = false;
                    // 接受來自呼叫程式的輸入資訊
                    p.StartInfo.RedirectStandardInput = true;
                    //輸出資訊
                    p.StartInfo.RedirectStandardOutput = true;
                    // 輸出錯誤
                    p.StartInfo.RedirectStandardError = true;
                    //不顯示程式視窗
                    p.StartInfo.CreateNoWindow = true;
                    //啟動程式
                    p.Start();
                    var test = command.Skip(i * data).Take(data).ToArray();
                    var count = 0;
                    var commandStr = "";
                    var commandCount = Convert.ToInt32(Math.Ceiling((double)test.Count() / 10));
                    if (test.Count() > 0)
                    {

                        foreach (var item in test)
                        {
                            count++;
                            var filePath = item.Split(".").FirstOrDefault();
                 //執行命令
var demo= $"{Environment.CurrentDirectory.ToString()}/ScriptFile/ProAnalysis {item} {filePath}.pa 0"; var demo1 = $"{Environment.CurrentDirectory.ToString()}/ScriptFile/pcap2featuresjson {item} {filePath}.json {filePath}.bin {filePath}.hex"; commandStr += demo + ";" + demo1; commandStr += ";"; if (count >= 100) { p.StandardInput.WriteLine(commandStr); count = 0; commandStr = ""; } } } p.StandardInput.WriteLine("exit"); p.StandardInput.AutoFlush = true; string strOuput = p.StandardOutput.ReadToEnd(); p.WaitForExit(); p.Close(); }); } catch (Exception e) { Console.WriteLine("失敗" + e.Message); } }

可以直接複用

詳細講解一下方法:Parallel.For讓多個bash並行執行,並且每個取出相等的命令,往bash寫入

相關文章