예제 #1
0
        //創建新進程, 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);
            }
        }
예제 #2
0
        //創建新進程, 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;
            }
        }
예제 #3
0
        //讀取變量
        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]);
            }
        }
예제 #4
0
        //取消進程的登錄
        //此函數只從 CurrentProcesses 中移除指定的進程, 不實際結束進程
        //在 IOPortedPrc 的 End() 方法時會被調用到
        //這樣是因為在 IOPortedPrc 對進程退出做更好的處理
        //當 IOPortedPrc 判斷已成功退出, 再叫 ProcessManager 取消登錄
        static public void RemoveProcess(IOPortedPrc prc)
        {
            CurrentProcesses.Remove(prc);

            return;
        }
예제 #5
0
        //取消進程的登錄
        //此函數只從 CurrentProcesses 中移除指定的進程, 不實際結束進程
        //在 IOPortedPrc 的 End() 方法時會被調用到
        //這樣是因為在 IOPortedPrc 對進程退出做更好的處理
        //當 IOPortedPrc 判斷已成功退出, 再叫 ProcessManager 取消登錄
        public static void RemoveProcess(IOPortedPrc prc)
        {
            CurrentProcesses.Remove(prc);

            return;
        }