//創建新進程, name 名字, enginePath 執行檔的路徑, arg 執行參數, 返回是否成功 static public bool AddProcess(string name, string enginePath, string arg = "", int CrashCount = 0) { //利用參數, 創建一個新的 IOPortedPrc IOPortedPrc prc = new IOPortedPrc(name, enginePath, arg, CrashCount); //嘗試啟動進程 //如果成功, 把進程添加進 CurrentProcesses, 返回 true //如果失敗, 返回 false try { prc.Start(); CurrentProcesses.Add(prc); return(true); } catch { return(false); } }
//創建新進程, name 名字, enginePath 執行檔的路徑, arg 執行參數, 返回是否成功 public static bool AddProcess(string name, string enginePath, string arg = "", bool IsApplication=false) { //利用參數, 創建一個新的 IOPortedPrc IOPortedPrc prc = new IOPortedPrc(name, enginePath, arg); prc.IsApplication = IsApplication; //嘗試啟動進程 //如果成功, 把進程添加進 CurrentProcesses, 返回 true //如果失敗, 返回 false try { prc.Start(); CurrentProcesses.Add(prc); return true; } catch { return false; } }
//讀取變量 static public string Read(string name) { //字串內出現引號會導致解析錯誤, 定義特殊變量 if (name == "{\"}" || name == "{QUOT}") { return("\""); } //字串內出現分號會導致解析錯誤, 定義特殊變量 else if (name == "{.,}") { return(";"); } // AZUSA 執行目錄 else if (name == "{AZUSA}") { return(Directory.GetCurrentDirectory()); } //簡單的 HTTP GET 回傳 else if (name.StartsWith("{http")) { string url = name.Substring(1, name.Length - 2); WebRequest req = WebRequest.Create(url); using (StreamReader sw = new StreamReader(req.GetResponse().GetResponseStream())) { return(sw.ReadToEnd()); } } //函式回傳 else if (name.StartsWith("{") && name.EndsWith("}") && name.Contains("(")) { name = name.Trim('{', '}'); string cmd = name.Split('(')[0]; string arg = name.Remove(name.Length - 1).Replace(cmd + "(", ""); //檢查是否有引擎登記接管了這個指令 // routed 記錄指令是否已被接管 bool routed = false; List <IOPortedPrc> ListCopy = new List <IOPortedPrc>(ProcessManager.GetCurrentProcesses()); //檢查每一個現在運行中的進程 foreach (IOPortedPrc prc in ListCopy) { try { //如果進程有接管這個指令, 就把指令內容傳過去 if (prc.RIDs.ContainsKey(cmd)) { //設 routed 為 true routed = true; //根據 RIDs 的值,決定只傳參數還是指令跟參數整個傳過去 //RIDs 的值如果是 true 的話就表示只傳參數 if (prc.RIDs[cmd]) { prc.WriteLine(arg); } else { prc.WriteLine(cmd + "(" + arg + ")"); } return(prc.GetReturn()); } } catch { } } //扔掉 ListCopy ListCopy = null; if (!routed) { if (File.Exists(Environment.CurrentDirectory + @"\Routines\" + cmd + ".exe")) { IOPortedPrc prc = new IOPortedPrc(name, Environment.CurrentDirectory + @"\Routines\" + cmd + ".exe", arg); return(prc.StartAndGetOutput()); } else if (File.Exists(Environment.CurrentDirectory + @"\Routines\" + cmd + ".bat")) { IOPortedPrc prc = new IOPortedPrc(cmd, "cmd.exe", "/C \"" + Environment.CurrentDirectory + @"\Routines\" + cmd + ".bat\" " + arg); return(prc.StartAndGetOutput()); } else if (File.Exists(Environment.CurrentDirectory + @"\Routines\" + cmd + ".vbs")) { IOPortedPrc prc = new IOPortedPrc(cmd, "cscript.exe", " \"" + Environment.CurrentDirectory + @"\Routines\" + cmd + ".vbs\" " + arg); return(prc.StartAndGetOutput()); } } return(name); } //日期時間 else if (name.StartsWith("{") && name.EndsWith("}")) { string datetime = DateTime.Now.ToString(name.TrimStart('{').TrimEnd('}')); if (datetime != name.TrimStart('{').TrimEnd('}')) { return(datetime); } else { return(name); } } //否則就返回變量環境裡的值 else { return(storage[name]); } }
//取消進程的登錄 //此函數只從 CurrentProcesses 中移除指定的進程, 不實際結束進程 //在 IOPortedPrc 的 End() 方法時會被調用到 //這樣是因為在 IOPortedPrc 對進程退出做更好的處理 //當 IOPortedPrc 判斷已成功退出, 再叫 ProcessManager 取消登錄 static public void RemoveProcess(IOPortedPrc prc) { CurrentProcesses.Remove(prc); return; }
//取消進程的登錄 //此函數只從 CurrentProcesses 中移除指定的進程, 不實際結束進程 //在 IOPortedPrc 的 End() 方法時會被調用到 //這樣是因為在 IOPortedPrc 對進程退出做更好的處理 //當 IOPortedPrc 判斷已成功退出, 再叫 ProcessManager 取消登錄 public static void RemoveProcess(IOPortedPrc prc) { CurrentProcesses.Remove(prc); return; }