public static void ShutdownWithMinutes_DelayMode(int countdownMinute) { if (countdownMinute >= 60) // bug needs fix. { SqlExecuter.记录延迟关机事件("1:" + (countdownMinute - 60) + ":0"); } else { SqlExecuter.记录延迟关机事件("0:" + countdownMinute + ":0"); } ShutdownUtil.CancelShutdownCommand(); ShutdownUtil.RunShutdownCommand(ShutdownUtil.Mode.关机, countdownMinute * 60); }
/// <summary> /// 启动终端模式 /// </summary> /// <param name="args">向程序输送的参数组</param> public static void RunConsoleApplication(String[] args) { // 传入的要使用的变量 int? 关机倒计时秒 = null; int? delay时间秒 = null; String 成功后弹出的字符串 = null; bool 取消关机 = false; bool 记录开机时间 = false; String mdf文件 = null; bool 睡眠 = false; bool 休眠 = false; bool 禁用缓存 = false; bool 离线模式 = false; bool 显示缓存 = false; bool 除缓存 = false; // 内部使用的变量 String cache文件 = null; String 失败后弹出的字符串 = null; // 检查跳过处理 if (File.Exists("C:\\Users\\" + ProgramLauncher.SystemUserName + "\\DONOTWRITEDATA")) { File.Delete("C:\\Users\\" + ProgramLauncher.SystemUserName + "\\DONOTWRITEDATA"); return; } // 解析所有参数并赋值 for (int i = 0; i < args.Length; i++) { try { switch (args[i]) { case "-s": case "/s": case "--shutdown_seconds": 关机倒计时秒 = FastModeExecutor.GetSecondFromTimeStringContainsMS(args[++i]); if (关机倒计时秒 == -1) { 失败后弹出的字符串 = "执行失败!时间请以s(秒)或m(分钟)结尾"; i = args.Length; //强制跳出大循环 } break; case "-d": case "/d": case "--shutdown_delay": delay时间秒 = FastModeExecutor.GetSecondFromTimeStringContainsMS(args[++i]); if (delay时间秒 == -1) { 失败后弹出的字符串 = "执行失败!时间请以s(秒)或m(分钟)结尾"; i = args.Length; //强制跳出大循环 } break; case "-c": case "/c": case "--comment": 成功后弹出的字符串 = args[++i].Replace("\\n", "\n"); break; case "-a": case "/a": case "--cancel_all": 取消关机 = true; break; case "-k": case "/k": case "--start": 记录开机时间 = true; if (HasNext(args, i)) { 失败后弹出的字符串 = "此功能已被废弃,请使用-db或-ca!"; i = args.Length; //强制跳出大循环 } //{ //有自定义数据库文件完整路径的参数 // mdf文件 = args[++i]; // cache文件 = mdf文件.Replace(".mdf", ".cache"); //} break; case "-h": case "/h": case "--hibernate": 休眠 = true; break; case "-sleep": case "/sleep": case "--sleep": 睡眠 = true; break; case "-db": case "/db": case "--database_filename": if (HasNext(args, i)) { mdf文件 = args[++i]; cache文件 = mdf文件.Replace(".mdf", ".cache"); } break; case "-ca": case "/ca": case "--cache": case "/cache": if (HasNext(args, i)) { cache文件 = args[++i]; } break; case "-dc": case "/dc": case "--disable_cache": 禁用缓存 = true; cache文件 = null; //如果禁用缓存,删除缓存文件信息 break; case "-offline": case "/offline": case "--offline": 离线模式 = true; break; case "-sc": case "/sc": case "--show_cache": 显示缓存 = true; break; case "-del": case "/del": case "--delete_cache": 除缓存 = true; break; default: PrintHelp(); break; } } catch (System.IndexOutOfRangeException) { ConsoleWriter.WriteLine("无法执行。原因:缺少参数错误!"); } } // 先判断是否有失败 if (失败后弹出的字符串 != null) { ConsoleWriter.WriteLine(失败后弹出的字符串 + "\n如需其他帮助请使用-help"); return; } /* 首先先判断是否必要调用数据库,如果必要则打开数据库,清除cache文件信息,保证后方调用都使用数据库。 */ // 在非离线模式 and 禁用缓存时才会打开数据库。 if (离线模式 == false && 禁用缓存 == true) { if (mdf文件 != null) { dbAgency.OpenConnection(mdf文件); //如果指定的数据库文件确实有用,就只在这里使用 } else { dbAgency.OpenConnection(); } } // 传入的是文件夹,添加完整文件名 if (mdf文件 != null && !mdf文件.EndsWith(".mdf", true, null)) { if (!mdf文件.EndsWith("\\")) { mdf文件 += "\\"; } mdf文件 += "TimeDatabase.mdf"; } if (cache文件 != null && !cache文件.EndsWith(".cache", true, null)) { if (!cache文件.EndsWith("\\")) { cache文件 += "\\"; } cache文件 += "TimeDatabase.cache"; } // 调整工作路径、修改cache文件名 if (cache文件 == null) { // 设置程序运行的文件夹为CurrentDirectory System.IO.Directory.SetCurrentDirectory(System.Windows.Forms.Application.StartupPath); } // 设置cache所在文件夹为CurrentDirectory else if (cache文件.Contains("\\")) { System.IO.Directory.SetCurrentDirectory(cache文件.Substring(0, cache文件.LastIndexOf("\\"))); } // 如果cache名称不是默认值,则修改Cache的名称 if (cache文件 != null && cache文件 != "" && Cache.CacheFilename != cache文件) { Cache.CacheFilename = cache文件; } // 检查开机时间 if (记录开机时间 == true) { if (离线模式) //离线模式优先 { ConsoleWriter.WriteLine("离线模式下记录开机时间已被禁止。"); } else { if (!SqlExecuter.记录开机事件("[Table]")) //未指定数据库时的默认调用。(调用数据库或缓存由内部处理) { 失败后弹出的字符串 = "错误!未能记录开机时间!"; } } } // 检查关机时间 if (关机倒计时秒 != null) { if (离线模式) { ShutdownUtil.RunShutdownCommand(ShutdownUtil.Mode.关机, 关机倒计时秒 ?? 0); } else { FastModeExecutor.ShutdownWithSeconds(关机倒计时秒 ?? 0); //内部实现自动处理是否调用缓存 } } // 检查延迟时间 if (delay时间秒 != null) { if (离线模式) { ConsoleWriter.WriteLine("暂不支持离线模式下的延迟时间,请使用窗体版本。"); } else { ShutdownWithSeconds_DelayMode(delay时间秒 ?? 0); //内部实现自动处理是否调用缓存 } } // 检查是否取消关机,与上方连续使用可以做到记录时间却不调用系统关机的目的 if (取消关机 == true) { ShutdownUtil.CancelShutdownCommand(); } if (睡眠 == true) { if (离线模式) { ShutdownUtil.RunSuspendCommand(ShutdownUtil.Mode.睡眠); } else if (cache文件 == null) { SqlExecuter.记录关机事件(); ShutdownUtil.RunSuspendCommand(ShutdownUtil.Mode.睡眠); 休眠结束(); //因为重启后数据库连接状态未改变,所以不需要分类讨论 } else //指定cache文件特殊对待 { //String shutdownSql = SqlExecuter.UsefulSqlExpressions.UpdateShutdownTimeSQL(); //Cache.AppendCache(shutdownSql, cache文件); SqlExecuter.记录关机事件(); ShutdownUtil.RunSuspendCommand(ShutdownUtil.Mode.睡眠); //String poweronSql = SqlExecuter.UsefulSqlExpressions.InsertPowerOnTimeSQL(); //Cache.AppendCache(poweronSql, cache文件); 休眠结束(); } } // 检查休眠 if (休眠 == true) { if (离线模式) { ShutdownUtil.RunSuspendCommand(ShutdownUtil.Mode.休眠); } else if (cache文件 == null) { SqlExecuter.记录关机事件(); ShutdownUtil.RunSuspendCommand(ShutdownUtil.Mode.休眠); 休眠结束(); //因为重启后数据库连接状态未改变,所以不需要分类讨论 } else //指定cache文件特殊对待 { //String shutdownSql = SqlExecuter.UsefulSqlExpressions.UpdateShutdownTimeSQL(); //Cache.AppendCache(shutdownSql, cache文件); SqlExecuter.记录关机事件(); ShutdownUtil.RunSuspendCommand(ShutdownUtil.Mode.休眠); //String poweronSql = SqlExecuter.UsefulSqlExpressions.InsertPowerOnTimeSQL(); //Cache.AppendCache(poweronSql, cache文件); 休眠结束(); } } if (显示缓存) { if (cache文件 == null) { ConsoleWriter.WriteLines(Cache.GetAllLines()); } else { ConsoleWriter.WriteLines(Cache.GetAllLines(cache文件)); } } if (除缓存) { if (cache文件 == null) { File.Delete(Cache.CacheFilename); } else { File.Delete(cache文件); } } if (!离线模式) { dbAgency.CloseConnection(); } if (成功后弹出的字符串 != null) { ConsoleWriter.WriteLine(成功后弹出的字符串); } Environment.Exit(0); }
public static void ShutdownWithSeconds_DelayMode(int delaySeconds) { SqlExecuter.记录延迟关机事件(delaySeconds); ShutdownUtil.CancelShutdownCommand(); ShutdownUtil.RunShutdownCommand(ShutdownUtil.Mode.关机, delaySeconds); }
/// <summary> /// 不显示窗体直接记录关机事件并根据参数执行关机 /// </summary> /// <param name="countdownSeconds">关机倒计时(按秒计)</param> public static void ShutdownWithSeconds(int countdownSeconds) { SqlExecuter.记录关机事件(); ShutdownUtil.CancelShutdownCommand(); ShutdownUtil.RunShutdownCommand(ShutdownUtil.Mode.关机, countdownSeconds); }