C#的命令行参数
????? 這一周嘗試著用C#寫了兩個后臺程序,主程序用CreateProcess()傳遞命令行參數并創建進程。在實現的過程中,碰到了一個問題,命令行參數中如果帶有空格該如何處理。一直認為,命令行中的空格用作參數的分隔符。如果參數內部有空格,該怎么辦呢?譬如命令行的參數為“祝福 張學友?\Program Files\1 2 3.lrc”。
????? 剛開始寫后臺程序時,沒考慮到這個問題。后來ZWF在使用時問起,才注意到。經過商量,決定自己定義一個命令行格式,用|作為分隔符。將“祝福 張學友 \Program Files\1 2 3.lrc”改為“祝福|張學友|\Program Files\1 2 3.lrc”。在后臺程序中,首先將所有的參數合并,然后再通過分隔符|解析各個字段,代碼如下:
using?System;using?System.Collections.Generic;
using?System.Text;
using?System.Windows.Forms;
namespace?ConsoleApplication1
{
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????String?temp?=?"";
????????????string?song,?singer,?path;
????????????int?head,?tail;
????????????//?合并命令行參數
????????????for?(int?i?=?0;?i?<?args.Length;?i++)
????????????{
????????????????MessageBox.Show(args[i]);
????????????????temp?+=?args[i];
????????????????temp?+=?"?";
????????????}
????????????MessageBox.Show(temp);
????????????try
????????????{
????????????????//?解析合并后的命令行
????????????????head?=?temp.IndexOf('|',?0);
????????????????song?=?temp.Substring(0,?head);
????????????????MessageBox.Show(song);
????????????????head?+=?1;
????????????????tail?=?temp.IndexOf('|',?head);
????????????????singer?=?temp.Substring(head,?tail?-?head);
????????????????MessageBox.Show(singer);
????????????????path?=?temp.Substring(tail?+?1);
????????????????MessageBox.Show(path);
????????????}
????????????catch{}
????????}
????}
}
?????? 主程序是用C++寫的,代碼如下:
int?_tmain(int?argc,?_TCHAR*?argv[]){
????TCHAR?szCMD[MAX_PATH];
????PROCESS_INFORMATION?pi;
????STARTUPINFO?sii;
????memset(&sii,?0,?sizeof(sii));
????sii.cb?=?sizeof(sii);
????sii.wShowWindow?=?SW_SHOW;
????sii.dwFlags?=?STARTF_USESHOWWINDOW;
????//?自定義格式的命令行參數
????wcscpy(szCMD,?L"?祝福|張學友|\\Program?Files\\1?2?3.lrc");
????//?使用系統支持的命令行參數
????//wcscpy(szCMD,L"?祝福?張學友?\"\\Program?Files\\1?2?3.lrc\"");
????CreateProcess(_T(".\\ConsoleApplication1.exe"),?szCMD,
????????NULL,?NULL,?0,?0,?NULL,?NULL,?&sii,?&pi);
????return?0;
}
?????? 注意,wcscpy(szCMD, L" 祝福|張學友|\\Program Files\\1 2 3.lrc");中祝福前必須留一個空格,否則會導致后臺程序接收的命令行不完整。關于這一點,請參考《C++和C#程序之間命令行參數傳遞和接收》,博主整理的非常細致。MSDN中有關C#命令行參數的說明,Main() 和命令行參數(C# 編程指南),其中提到了“與 C 和 C++ 不同,C#程序的名稱不會被當作第一個命令行參數”。
????? 雖然通過自定義命令行的方式,解決了命令行參數本身帶有空格的問題,但總感覺有點怪。這是參數不多,如果參數多了怎么辦?按理來說,命令行參數的解析規則不能這么簡單。在MSDN中查了一下,有其具體的解析規則Parsing C Command-Line Arguments。其中第一個示例就是解決命令行參數中帶有空格的問題,只要將該參數放在一對雙引號內就可以了。所以,將“祝福 張學友 \Program Files\1 2 3.lrc”改成“ 祝福 張學友 \"\Program Files\1 2 3.lrc\"”即可。通過實驗證明,這種方法可行,且簡單方便。
總結
- 上一篇: 在SharePoint2007中创建站点
- 下一篇: 一起谈.NET技术,C# 中奇妙的函数之