public AppParamFrm(CommanderData cmdObj) { InitializeComponent(); GlobalVar.Instanse.Init(); SetInfo(cmdObj); }
/// <summary> /// 调用命令. /// </summary> /// <param name="cmdObj">The CMD obj.</param> public static void Execute(CommanderData cmdObj) { StringCollection scBefore, scAfter; ParseBACmd(cmdObj.ExtCmds, out scBefore, out scAfter); //查找系统环境变量或直接打开文件夹 if (scBefore.Contains(cmdObj.Cmd) || scAfter.Contains(cmdObj.Cmd)) { throw new ExtCommandLineBrokenException("扩展命令集不能包含自身"); } try { //前执行 foreach (string bCmd in scBefore) MatchForInvoke(bCmd, cmdObj); Run(cmdObj.ParsedCmd, cmdObj.Args); //后执行 foreach (string aCmd in scAfter) MatchForInvoke(aCmd, cmdObj); } catch (ExtCommandLineBrokenException) { } }
/// <summary> /// 根据shortcut查找程序. /// 传进来的shortcut应该通过Trim,否则不能正常解析 /// 开启新线程解析命令并运行 /// </summary> /// <param name="shortcut">The shortcut.</param> /// <param name="bPassParse">if set to <c>true</c> 直接运行,不进行解析.</param> public static void FindToRun(string shortcut,bool bRunDirectly) { CommanderData cmdObj = new CommanderData(); cmdObj.Cmd = shortcut; cmdObj.IsRunDirectly = bRunDirectly; System.Threading.ThreadPool.QueueUserWorkItem(StartFindThread, cmdObj); }
/// <summary> /// 直接执行护展命令 /// </summary> /// <param name="sExtCmds">The s ext CMDS.</param> public static void ExecExtCmd(string sExtCmds, CommanderData Context) { StringCollection scBefore, scAfter; ParseBACmd(sExtCmds, out scBefore, out scAfter); //先执行 foreach (string bCmd in scBefore) MatchForInvoke(bCmd, Context); //后执行 foreach (string aCmd in scAfter) MatchForInvoke(aCmd, Context); }
private static void MatchForInvoke(string FullCmd, CommanderData Context) { m_invoker.Invoke(FullCmd, Context); }
//private bool FindCommand(out ConfigData cd) //{ // GlobalVar.Helper.AddSelect("programs", ""); // return true; //} /// <summary> /// 根据配置,解析用户输入的命令成为系统可识别的命令和参数. /// </summary> /// <param name="shortcut">用户输入的快捷命令.</param> /// <param name="cmd">系统可识别的命令.</param> /// <param name="args">参数.</param> private static void ParseCommand(string shortcut, CommanderData cmdObj) { string sCmd; string sArgs; string sExtCmd; //获取命令和参数间隔的空格位置 int iPos = GetParamPos(shortcut); if (iPos == -1) { sCmd = shortcut; sArgs = String.Empty; sExtCmd = String.Empty; } else { sCmd = shortcut.Substring(0, iPos); sArgs = shortcut.Substring(++iPos, shortcut.Length - iPos); int iIc = sArgs.IndexOf(INNERSTART); if (iIc != -1) { sExtCmd = ParseExtCmd(sArgs.Substring(iIc).Trim()); sArgs = sArgs.Substring(0, iIc); } else sExtCmd = String.Empty; } //构造命令对象 cmdObj.Args += " " + sArgs;//用 += 是因为参数可能来自用户输入和配置 cmdObj.ParsedCmd = sCmd; cmdObj.ExtCmds = sExtCmd; }
private void SetInfo(CommanderData obj) { groupBox.Text = "命令:" + obj.Cmd; }
public void ParseCommandTest() { string shortcut = string.Empty; // TODO: 初始化为适当的值 CommanderData cmdObj = new CommanderData(); //测试单个快捷命令 shortcut = "cmd"; ProgFinder_Accessor.ParseCommand(shortcut, cmdObj); Assert.AreEqual<string>("cmd", cmdObj.ParsedCmd); Assert.AreEqual<string>(string.Empty, cmdObj.Args.Trim().Trim()); Assert.AreEqual<string>(string.Empty, cmdObj.ExtCmds); Cleer(cmdObj); //测试单个完整路径,带空格路径情况已经包含普通情况(不带空格) shortcut = @"C:\Windows\program files\Commander.exe"; ProgFinder_Accessor.ParseCommand(shortcut, cmdObj); Assert.AreEqual<string>(@"C:\Windows\program files\Commander.exe", cmdObj.ParsedCmd); Assert.AreEqual<string>(string.Empty, cmdObj.Args.Trim()); Assert.AreEqual<string>(string.Empty, cmdObj.ExtCmds); Cleer(cmdObj); //测试带参数命令 shortcut = "cmd args"; ProgFinder_Accessor.ParseCommand(shortcut, cmdObj); Assert.AreEqual<string>("cmd", cmdObj.ParsedCmd); Assert.AreEqual<string>("args", cmdObj.Args.Trim()); Assert.AreEqual<string>(string.Empty, cmdObj.ExtCmds); Cleer(cmdObj); //测试带参数带空格完整路径 shortcut = @"C:\Windows\program files\Commander.exe args"; ProgFinder_Accessor.ParseCommand(shortcut, cmdObj); Assert.AreEqual<string>(@"C:\Windows\program files\Commander.exe", cmdObj.ParsedCmd); Assert.AreEqual<string>("args", cmdObj.Args.Trim()); Assert.AreEqual<string>(string.Empty, cmdObj.ExtCmds); Cleer(cmdObj); //测试URL shortcut = "http://www.Commander.com"; ProgFinder_Accessor.ParseCommand(shortcut, cmdObj); Assert.AreEqual<string>("http://www.Commander.com", cmdObj.ParsedCmd); Assert.AreEqual<string>(string.Empty, cmdObj.Args.Trim()); Assert.AreEqual<string>(string.Empty, cmdObj.ExtCmds); Cleer(cmdObj); //测试FTP路径 shortcut = "\\88.88.88.88"; ProgFinder_Accessor.ParseCommand(shortcut, cmdObj); Assert.AreEqual<string>("\\88.88.88.88", cmdObj.ParsedCmd); Assert.AreEqual<string>(string.Empty, cmdObj.Args.Trim()); Assert.AreEqual<string>(string.Empty, cmdObj.ExtCmds); Cleer(cmdObj); //测试内部命令(内部命令只能出现在配置中,不能由用户在运行窗口输入) shortcut = @"C:\windows\program files\Commander.exe args{+$check| +before| after}"; ProgFinder_Accessor.ParseCommand(shortcut, cmdObj); Assert.AreEqual<string>(@"C:\windows\program files\Commander.exe", cmdObj.ParsedCmd); Assert.AreEqual<string>("args", cmdObj.Args.Trim()); Assert.AreEqual<string>("+$check| +before| after", cmdObj.ExtCmds); Cleer(cmdObj); //测试内部命令 无参数,命令前后可以有空格 shortcut = @"C:\windows\program files\Commander.exe {+ $check| +before | after}"; ProgFinder_Accessor.ParseCommand(shortcut, cmdObj); Assert.AreEqual<string>(@"C:\windows\program files\Commander.exe", cmdObj.ParsedCmd); Assert.AreEqual<string>(string.Empty, cmdObj.Args.Trim()); Assert.AreEqual<string>("+ $check| +before | after", cmdObj.ExtCmds); Cleer(cmdObj); }
// //编写测试时,还可使用以下属性: // //使用 ClassInitialize 在运行类中的第一个测试前先运行代码 //[ClassInitialize()] //public static void MyClassInitialize(TestContext testContext) //{ // M_cmdObj = new CommanderData(); //} // //使用 ClassCleanup 在运行完类中的所有测试后再运行代码 //[ClassCleanup()] //public static void MyClassCleanup() //{ //} private void Cleer(CommanderData cmdObj) { cmdObj.Args = string.Empty; cmdObj.ParsedCmd = string.Empty; cmdObj.ExtCmds = string.Empty; }