在智慧型手機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參數。
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);
}
}

類似工具:
介紹好用元件:ConsoleFx ( 處理命令列程式的函示庫 )
參考資料:
Command Line Parser Library Documentation
Console Appplications in .NET, or Teaching a New Dog Old Tricks