控制台程序小工具:输入密码、指令指派、自动补全与帮助集成

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

  一、简介

    控制台程序小巧、便捷,开发起来简单。一般,我写项目时习惯在原定客户端之外,写一个控制台的客户端。这样有几个好处:

(1)       开发量较WebGUI少得多。

(2)       运行起来简单,占有资源很少。

(3)       便于跟踪程序的运行。比如,用 log4net 记录日志的话,将appender-ref设置成ConsoleAppender,可以清楚看清系统运行轨迹,在使用nhibernate/activerecord开发时尤其方便。

(4)       当为同一个系统开发两种不同的UI时,会自觉的做好分层,这样可以使系统的层次结构更清晰,便于维护。

然而,虽然控制台程序的开发量少,也还是有一些常用功能实现起来较繁琐。比如,以下几个问题:

(1)       输入密码。用户输入密码时,控制台显示****而不是密码明文;

(2)       指令的解析与分派。控制台中,经常需要向程序输入纯字符串格式的指令,解析指令,解析参数的个数,调用相应的方法。

(3)       指令的帮助系统。显示全部指令及其介绍。

(4)       指令的自动补全。

这几个问题在写控制台程序上经常会碰到,为此我写了两个类 ConsoleUtil  CmdDispatcher,实现了上述功能,以供复用。于此下载代码

代码是C#3.0 写的,若要用在其它C#版本,需要做一定的改动。

二、使用方式:

(1)       输入密码

调用静态方法String ConsoleUtil.ReadPassword(String msg, String errMsgOnNull) 获取输入的密码。

(2)       指令的解析、分派、自动补全与帮助系统

(a)创建一个 CmdDispatcher 对象。

(b)使用CmdDispatcher对象的AddCmdFunc方法,加入指令委托。这里定义了五种委托:

     delegate   void  Func0();
    
delegate   void  Func1(String s1);
    
delegate   void  Func2(String s1, String s2);
    
delegate   void  Func3(String s1, String s2, String s3);
    
delegate   void  Func4(String s1, String s2, String s3, String s4);

AddCmdFunc方法有两种使用方式。

AddCmdFunc(String cmd, Func0|Func1|Func2|Func3|Func4 func)

AddCmdFunc(String cmd, String argsString, String introduce, Func0|Func1|Func2|Func3|Func4 func)

后一种方式中 argsString 是该指令的参数字符串,introduce 是对这个指令的介绍。这两个变量的唯一意义是显示在该指令的help信息之中。如果使用前一种方式,该指令的help信息便是光秃秃的。

   比如,

            CmdDispatcher cd  =   new  CmdDispatcher();
            cd.AddCmdFunc(
" help " " 无参数 " " 查询帮助. " ,
                () 
=>   { cd.PrintHelp(); } );
            cd.AddCmdFunc(
" cmd1 " " 无参数 " " 指令cmd1. " ,
                () 
=>   { Console.WriteLine(String.Format("Invoke cmd1.")); } );
            cd.AddCmdFunc(
" cmd2 " " arg0 arg1 " " 指令cmd1. " ,
                (arg0, arg1) 
=>   { Console.WriteLine(String.Format("Invoke cmd1({0},{1}).", arg0, arg1)); } );
            cd.AddCmdFunc(
" cmd3 " ,
                (arg0, arg1, arg2) 
=>   { Console.WriteLine(String.Format("Invoke cmd1({0},{1},{2}).", arg0, arg1, arg2)); } );

显示出来的 help 信息为:

help    无参数
        查询帮助.

cmd2    arg0 arg1
        指令cmd1.

cmd3    无参数

    (3)CmdDispatcher对象的String ReadlineWithIntelliSence()方法获取控制台输入的指令.通过CmdDispatcher对象的Handle(String input)方法便可解析指令,分派给相应的委托完成。

    举例:

             while  ( true )
            
{
                Console.Write(cd.Prefix);    
// 在控制台上输出提示符 >>。
                String input = cd.ReadlineWithIntelliSence();
                cd.Handle(input);
            }


     (4)不匹配的指令的处理方法
     CmdDispatcher 有一个属性, public Func0 DefaultFunc { get; set; } 。 CmdDispatcher  找不到匹配的委托时,便调用这个 delegate 。你可以自行设置 DefaultFunc,否则则用默认的内置 delegate。  

三、一个完整的例子

    下面是一个完整的例子:

 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Linq;
 4 using  System.Text;
 5
 6 namespace  ConsoleTest
 7 {
 8    class Program
 9    {
10        static Boolean EXIT = false;
11        static void Main(string[] args)
12        {
13            String id = ConsoleUtil.Readline("请输入帐号:","帐号不能为空.");
14            String pwd = ConsoleUtil.ReadPassword("请输入密码:","密码不能为空.");
15            Console.WriteLine("欢迎你,"+ id + "!");
16            CmdDispatcher cd = CreateDispatcher();
17            while (true)
18            {
19                Console.Write(cd.Prefix);
20                String input = cd.ReadlineWithIntelliSence();
21                cd.Handle(input);
22                if (EXIT) return;
23            }

24        }

25
26        static CmdDispatcher CreateDispatcher()
27        {
28            CmdDispatcher cd = new CmdDispatcher();
29            cd.AddCmdFunc("help""无参数""查询帮助.",
30                () => { cd.PrintHelp(); });
31            cd.AddCmdFunc("help""cmd""查询指定指令的帮助.",
32                (cmd) => { cd.PrintHelp(cmd); });
33            cd.AddCmdFunc("exit","无参数","退出程序.",
34                () => { EXIT = true; });
35            cd.AddCmdFunc("cmd1""无参数""指令cmd1.",
36                () => { Console.WriteLine(String.Format("Invoke cmd1.")); });
37            cd.AddCmdFunc("cmd1""arg0""指令cmd1.",
38                (arg0) => { Console.WriteLine(String.Format("Invoke cmd1({0}).", arg0)); });
39            cd.AddCmdFunc("cmd2""arg0 arg1""指令cmd1.",
40                (arg0, arg1) => { Console.WriteLine(String.Format("Invoke cmd1({0},{1}).", arg0, arg1)); });
41            cd.AddCmdFunc("cmd3",
42                (arg0, arg1, arg2) => { Console.WriteLine(String.Format("Invoke cmd1({0},{1},{2}).", arg0, arg1, arg2)); });
43            return cd;
44        }

45    }

46}

47

    运行结果:



下载代码

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2008/05/22/1204445.html如需转载请自行联系原作者


xiaotie 集异璧实验室(GEBLAB)

相关文章
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
Voice-Pro:开源AI音频处理工具,集成转录、翻译、TTS等一站式服务
Voice-Pro是一款开源的多功能音频处理工具,集成了语音转文字、文本转语音、实时翻译、YouTube视频下载和人声分离等多种功能。它支持超过100种语言,适用于教育、娱乐和商业等多个领域,为用户提供一站式的音频处理解决方案,极大地提高工作效率和音频处理的便捷性。
72 10
Voice-Pro:开源AI音频处理工具,集成转录、翻译、TTS等一站式服务
|
4月前
|
分布式计算 DataWorks 关系型数据库
MaxCompute 生态系统中的数据集成工具
【8月更文第31天】在大数据时代,数据集成对于构建高效的数据处理流水线至关重要。阿里云的 MaxCompute 是一个用于处理大规模数据集的服务平台,它提供了强大的计算能力和丰富的生态系统工具来帮助用户管理和处理数据。本文将详细介绍如何使用 DataWorks 这样的工具将 MaxCompute 整合到整个数据处理流程中,以便更有效地管理数据生命周期。
143 0
|
2月前
|
Web App开发 Shell Linux
MacOS环境-手写操作系统-41-mem 第一个控制台程序
MacOS环境-手写操作系统-41-mem 第一个控制台程序
20 1
|
3月前
|
Kubernetes Go 持续交付
一个基于Go程序的持续集成/持续部署(CI/CD)
本教程通过一个简单的Go程序示例,展示了如何使用GitHub Actions实现从代码提交到Kubernetes部署的CI/CD流程。首先创建并版本控制Go项目,接着编写Dockerfile构建镜像,再配置CI/CD流程自动化构建、推送Docker镜像及部署应用。此流程基于GitHub仓库,适用于快速迭代开发。
69 3
|
3月前
|
Kubernetes 持续交付 Go
创建一个基于Go程序的持续集成/持续部署(CI/CD)流水线
创建一个基于Go程序的持续集成/持续部署(CI/CD)流水线
|
2月前
|
存储 缓存 安全
如何使用 PHP 将天气跟踪集成到 Web 应用程序中
如何使用 PHP 将天气跟踪集成到 Web 应用程序中
33 0
|
4月前
|
小程序 开发者
微信开发者工具如何集成SVN、同时解决集成SVN无效果的问题
这篇文章介绍了如何在微信开发者工具中集成SVN版本控制系统,并提供了解决集成后无效果问题的方法。
微信开发者工具如何集成SVN、同时解决集成SVN无效果的问题
|
3月前
|
缓存 数据可视化 jenkins
推荐2款实用的持续集成与部署(CI&CD)自动化工具
推荐2款实用的持续集成与部署(CI&CD)自动化工具
215 1
|
4月前
|
Java jenkins Shell
jenkins学习笔记之五:Maven、Ant、Gradl、Node构建工具集成
jenkins学习笔记之五:Maven、Ant、Gradl、Node构建工具集成
|
4月前
|
安全 Shell 数据安全/隐私保护
CI/CD笔记.Gitlab系列:控制台强制修改root用户密码
CI/CD笔记.Gitlab系列:控制台强制修改root用户密码
172 2