讀取多個參數的命令列程式 ─ 使用 Command Line Parser Library

  • 3057
  • 0

在智慧型手機App正夯的現在,寫命令列程式算是復古吧(在Windows平台下!)。

在智慧型手機App正夯的現在,寫命令列程式算是復古吧(在Windows平台下!)。

 

在Virtual Studio裡選擇新增一個主控台程式專案,程式碼會像是:


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

 

從args這個字串陣列來讀取外部輸入的參數。像是args[1], args[2], args[3] …。 但是這樣每個參數的位置只能是固定的,如果我們想更彈性一點,以ping指令來舉例:
ping www.google.com -n 30 -w 3000

(ping Google 30秒,每個回覆的等候逾時為3000毫秒。) 我們可以把-n跟-w互換位置(本來就該可以這樣),或是完全不加參數,最好再有個給使用者說明的help參數。

ping_help

Command Line Parser Library(http://commandline.codeplex.com/)這個已經寫好的libary可以滿足以上的需求。 在把下載的CommandLine.dll加入參考,然後程式碼中加入:


using CommandLine;
using CommandLine.Text;

 

就可以開始使用了。這裡用一個列出指定目錄下小於指定大小的檔案的程式來作例子。首先寫一個名為Options的class,在裡頭定義每個參數的型別及說明。

private static readonly HeadingInfo _headingInfo = new HeadingInfo("GetSmallFile","");
class Options
{
    [Option("p", "path", Required = true, HelpText = "Input target directory path.")]
    public string targetDirectories = string.Empty;

    [Option("s", "size", Required = true, HelpText = "Get file which small than [s] kb.")]
    public int kb = 0;

    [Option("e", "extension", HelpText = "Specific file extention")]
    public string extension = "*";

    [Option(null, "save", HelpText = "Save to List.csv.")]
    public bool saveFile = false;

    [HelpOption(HelpText = "Display this help screen.")]
    public string GetUsage()
    {
        HelpText help = new HelpText(Program._headingInfo);
        help.AddPreOptionsLine("Input a direct path and a specific size (kb),");
        help.AddPreOptionsLine("You will get a file list (.csv) whose size small than specific size.");
        help.AddPreOptionsLine("Ex: GetSmallFile -p X:\\ -s 5 -e txt --save");
        help.AddOptions(this);
        return help;
    }
}

 

在Main裡面實作介面ICommandLineParser來讀入args進Options型別的變數中。

static void Main(string[] args)
{
    Options options = new Options();
    ICommandLineParser parser = new CommandLineParser();

    if (parser.ParseArguments(args, options, Console.Error))
    {
        string targetDirectories = options.targetDirectories;
        long inputBytes = options.kb * 1000;
        string fileExtension = "*." + options.extension;

        StringBuilder csvLines = new StringBuilder();
        csvLines.AppendLine("\"FileName\",\"Size\",\"LastModified\"");

        DirectoryInfo di = new DirectoryInfo(targetDirectories);
        FileInfo[] allFiles = di.GetFiles(fileExtension);

        foreach (FileInfo fi in allFiles)
        {
            if (fi.Length < inputBytes)
            {
                string fileName = fi.Name;
                if (!fileExtension.EndsWith("*.*"))
                    fileName = fi.Name.Replace(fi.Extension, "");
                if (options.saveFile)
                {
                    csvLines.AppendFormat("\"{0}\",\"{1}\",\"{2}\"", fileName, fi.Length.ToString(), fi.LastWriteTime.ToString("yyyy/MM/dd HH:mm"));
                    csvLines.AppendLine();
                }
                else
                {
                    Console.WriteLine("{0,-25}:{1,-8}:{2}", fileName, fi.Length.ToString(), fi.LastWriteTime.ToString());
                }
            }
        }

        if (options.saveFile)
        {
            StreamWriter sw = new StreamWriter("List.csv", false, Encoding.UTF8);
            sw.Write(csvLines.ToString());
            sw.Close();
        }
    }
    else
    {
        Environment.Exit(1);
    }
}

 

getsmall_help

 

類似工具:

介紹好用元件:ConsoleFx ( 處理命令列程式的函示庫 )

Args

 

參考資料:

Command Line Parser Library Documentation

Console Appplications in .NET, or Teaching a New Dog Old Tricks