青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0
    當我們的程序需要運行在命令行環境下的時候,分解復雜的命令行參數往往成為一件不難但又麻煩的事情。我們經常發現.net的開發工具的命令行格式都是"/parameterA:valueA /parameterB:valueB"。如果我們希望使用這種格式的命令行參數的話,如何分析就成為我們需要解決的一個問題。

    我們可以通過WinMain或者GetCommandLine()來獲得一個unicode格式的命令行參數。這個命令行參數是沒有被分析過的,一個完整的字符串。首先,我們使用空格分解字符串,不過在遇到雙引號的時候,我們忽略空格一直到遇到另一個雙引號為止。所以下面的命令行參數:
"e:\Coding\VL++\Tools\KfpCompiler\Debug\KfpCompiler.exe" /library:"C:\Kernel FP\Library\" /output:"C:\Kernel FP\Output\" /code:"C:\Kernel FP\Game\Project.kproj" /print-error /print-report
    將會被分解成6行:
1 "e:\Coding\VL++\Tools\KfpCompiler\Debug\KfpCompiler.exe"
2 /library:"C:\Kernel FP\Library\"
3 /output:"C:\Kernel FP\Output\"
4 /code:"C:\Kernel FP\Game\Project.kproj"
5 /print-error
6 /print-report

    對于每一行的命令,我們可以總結出以下幾種格式:
    1、值
    2、/參數
    3、/參數:值
    我們可以規定,如果值的第一個字符和最后一個字符都是雙引號的話,那么忽略這兩個雙引號。我使用Vczh GUI寫了一個win32程序顯示命令行分析的結果,代碼和截圖如下:

    首先是程序的代碼。這個程序閱讀命令行參數之后,將分析結果顯示在一個文本框上:
 1 #include "..\..\..\Library\Windows\VL_WinGUI.h"
 2 
 3 using namespace vl;
 4 using namespace vl::windows;
 5 using namespace vl::windows::placement;
 6 
 7 class MainForm : public VL_WinForm
 8 {
 9 protected:
10     VL_WinEdit*            edtCommandLines;
11 
12     void InitControls()
13     {
14         edtCommandLines=new VL_WinEdit(this,true);
15         edtCommandLines->SetVScroll(true);
16         edtCommandLines->SetHScroll(true);
17 
18         ApplyPlacement(
19             pControl(edtCommandLines,10)
20             );
21 
22         this->OnShow.Bind(this,&MainForm::MainForm_OnShow);
23     }
24 
25     void MainForm_OnShow(VL_Base* Sender)
26     {
27         VL_WinParameters* Parameters=GetApplication()->GetParameters();
28         Parameters->Parse(L'/',L':');
29         VUnicodeString Output;
30 
31         Output+=L"Command   : ["+Parameters->GetCommandLineString()+L"]\r\n";
32         for(VInt i=0;i<Parameters->GetCount();i++)
33         {
34             Output+=L"Parameter : ["+Parameters->GetParameter(i)+L"]\r\n";
35             Output+=L"Value     : ["+Parameters->GetValue(i)+L"]\r\n";
36         }
37         edtCommandLines->SetText(Output);
38     }
39 
40 public:
41     MainForm():VL_WinForm(true)
42     {
43         SetClientWidth(400);
44         SetClientHeight(300);
45         SetBorder(vwfbSingle);
46         SetText(L"Command Lines");
47         InitControls();
48         MoveCenter();
49     }
50 };
51 
52 void main()
53 {
54     (new MainForm)->Show();
55     GetApplication()->Run();
56 }

    然后是運行結果:

    程序中用到的VL_WinParameters類的代碼如下:

    頭文件:
 1         class VL_WinParameters : public VL_Base
 2         {
 3         protected:
 4             class CommandPair
 5             {
 6             public:
 7                 typedef VL_List<CommandPair , false>        List;
 8 
 9                 VUnicodeString        Parameter;
10                 VUnicodeString        Value;
11             };
12 
13             VUnicodeString            FString;
14             CommandPair::List        FCommands;
15             VWChar                    FParameterChar;
16             VWChar                    FValueChar;
17             VBool                    FParsed;
18         public:
19             VL_WinParameters(VUnicodeString Command);
20             ~VL_WinParameters();
21 
22             VUnicodeString            GetCommandLineString();
23             VInt                    GetCount();
24             VUnicodeString            GetParameter(VInt Index);
25             VUnicodeString            GetValue(VInt Index);
26             VBool                    IsParsed();
27             void                    Parse(VWChar ParameterChar , VWChar ValueChar);
28         };

    實現文件:
  1         VL_WinParameters::VL_WinParameters(VUnicodeString Command)
  2         {
  3             FString=Command;
  4             FParsed=false;
  5             FParameterChar=L'\0';
  6             FValueChar=L'\0';
  7         }
  8 
  9         VL_WinParameters::~VL_WinParameters()
 10         {
 11         }
 12 
 13         VUnicodeString VL_WinParameters::GetCommandLineString()
 14         {
 15             return FString;
 16         }
 17 
 18         VInt VL_WinParameters::GetCount()
 19         {
 20             return FCommands.GetCount();
 21         }
 22 
 23         VUnicodeString VL_WinParameters::GetParameter(VInt Index)
 24         {
 25             return FCommands[Index].Parameter;
 26         }
 27 
 28         VUnicodeString VL_WinParameters::GetValue(VInt Index)
 29         {
 30             return FCommands[Index].Value;
 31         }
 32 
 33         VBool VL_WinParameters::IsParsed()
 34         {
 35             return FParsed;
 36         }
 37 
 38         void VL_WinParameters::Parse(VWChar ParameterChar , VWChar ValueChar)
 39         {
 40             if(!ParameterChar || !ValueChar)return;
 41             if(FParameterChar!=ParameterChar || FValueChar!=ValueChar)
 42             {
 43                 FParameterChar=ParameterChar;
 44                 FValueChar=ValueChar;
 45 
 46                 FCommands.Clear();
 47                 VL_List<VUnicodeString , false> CommandStrings;
 48                 {
 49                     PCWChar Buffer=FString.Buffer();
 50                     VUnicodeString CurrentCommand;
 51                     VBool InString=false;
 52 
 53                     while(true)
 54                     {
 55                         if(InString)
 56                         {
 57                             switch(*Buffer)
 58                             {
 59                             case L'\0':
 60                                 InString=false;
 61                                 if(CurrentCommand!=L"")
 62                                 {
 63                                     CommandStrings.Add(CurrentCommand);
 64                                     CurrentCommand=L"";
 65                                 }
 66                                 break;
 67                             case L'\"':
 68                                 InString=false;
 69                             default:
 70                                 CurrentCommand+=*Buffer;
 71                             }
 72                         }
 73                         else
 74                         {
 75                             switch(*Buffer)
 76                             {
 77                             case L' ':case L'\0':
 78                                 if(CurrentCommand!=L"")
 79                                 {
 80                                     CommandStrings.Add(CurrentCommand);
 81                                     CurrentCommand=L"";
 82                                 }
 83                                 break;
 84                             case L'\"':
 85                                 InString=true;
 86                             default:
 87                                 CurrentCommand+=*Buffer;
 88                             }
 89                         }
 90                         if(*Buffer)
 91                         {
 92                             Buffer++;
 93                         }
 94                         else
 95                         {
 96                             break;
 97                         }
 98                     }
 99                 }
100                 for(VInt i=0;i<CommandStrings.GetCount();i++)
101                 {
102                     CommandPair Pair;
103                     PCWChar Buffer=CommandStrings[i].Buffer();
104                     if(*Buffer==FParameterChar)
105                     {
106                         Buffer++;
107                         while(true)
108                         {
109                             if(*Buffer)
110                             {
111                                 if(*Buffer==FValueChar)
112                                 {
113                                     Buffer++;
114                                     break;
115                                 }
116                                 else
117                                 {
118                                     Pair.Parameter+=*Buffer;
119                                     Buffer++;
120                                 }
121                             }
122                             else
123                             {
124                                 break;
125                             }
126                         }
127                     }
128                     if(*Buffer)
129                     {
130                         Pair.Value=Buffer;
131                         if(Pair.Value.Length()>=2 && Pair.Value.GetChar(0)==L'\"' && Pair.Value.GetChar(Pair.Value.Length()-1)==L'\"')
132                         {
133                             Pair.Value=Pair.Value.SubString(1,Pair.Value.Length()-2);
134                         }
135                     }
136                     FCommands.Add(Pair);
137                 }
138                 FParsed=true;
139             }
140         }
posted on 2008-12-24 01:13 陳梓瀚(vczh) 閱讀(2203) 評論(2)  編輯 收藏 引用 所屬分類: C++

評論:
# re: 分解復雜的命令行參數 2008-12-24 04:33 | amuro1987218
這個腳本語言準備跨平臺么
win32的話用CommandLineToArgvW可以分割出參數  回復  更多評論
  
# re: 分解復雜的命令行參數 2008-12-24 04:35 | amuro1987218
似乎剛才理解失誤 是在闡述制定的規則是把 閃了  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            美女国产一区| 99re8这里有精品热视频免费| 国产精品免费网站在线观看| 欧美不卡视频| 欧美~级网站不卡| 欧美成人在线免费视频| 久久综合色一综合色88| 久久综合色婷婷| 欧美精品国产| 国产精品大片| 国产一区二区高清不卡| 在线观看91精品国产入口| 91久久久亚洲精品| 亚洲一区久久久| 欧美在线观看一区| 免费在线看一区| 日韩亚洲欧美精品| 亚洲欧美日韩视频二区| 久久精品免费电影| 欧美久久久久久久| 国产精自产拍久久久久久| 好吊妞这里只有精品| 亚洲麻豆视频| 久久精品亚洲一区二区三区浴池| 久久欧美肥婆一二区| 亚洲人妖在线| 亚洲欧美第一页| 美女脱光内衣内裤视频久久网站| 欧美三级在线| 亚洲电影第三页| 午夜精品久久久久久99热软件| 久久久久国产精品一区三寸| 欧美经典一区二区| 一区二区三区.www| 欧美自拍偷拍午夜视频| 免费在线一区二区| 国产精品乱码久久久久久| 一区视频在线播放| 亚洲欧美日韩天堂| 亚洲激情图片小说视频| 欧美伊人久久大香线蕉综合69| 欧美国产视频日韩| 一区免费观看| 久久精品国产免费观看| 日韩视频永久免费观看| 老司机精品视频网站| 国产精品日产欧美久久久久| 亚洲裸体视频| 欧美激情第一页xxx| 午夜精品福利一区二区三区av | 亚洲精品一区二区三区在线观看| 欧美一区二区三区四区在线观看地址 | 欧美日韩高清在线一区| 伊人久久婷婷| 久久成年人视频| 亚洲手机成人高清视频| 欧美日韩视频在线观看一区二区三区| 一区二区视频欧美| 久久影音先锋| 久久精品国产久精国产思思| 国产精品美女久久久浪潮软件| 一本到高清视频免费精品| 亚洲精品1234| 欧美精品三级在线观看| 亚洲六月丁香色婷婷综合久久| 欧美69视频| 可以免费看不卡的av网站| 1769国产精品| 亚洲国产精品毛片| 欧美理论视频| 亚洲午夜在线视频| 亚洲视频在线观看视频| 国产精品一区二区久久久| 欧美亚洲视频在线观看| 亚洲欧美综合网| 国内精品国产成人| 免费试看一区| 欧美黄网免费在线观看| 中文av一区特黄| 亚洲在线成人精品| 国产综合精品一区| 欧美成人在线免费视频| 欧美国产激情二区三区| 日韩一级黄色av| 亚洲精品国产精品国自产观看| 亚洲欧美日韩精品久久亚洲区| 亚洲少妇一区| 国产午夜久久| 亚洲二区在线视频| 欧美日韩在线播放三区| 午夜国产不卡在线观看视频| 亚洲男女毛片无遮挡| 韩曰欧美视频免费观看| 亚洲激情六月丁香| 国产老女人精品毛片久久| 嫩草影视亚洲| 国产精品进线69影院| 久久这里只有| 欧美日韩少妇| 久久综合中文色婷婷| 欧美日韩国产精品一卡| 久久精品91久久香蕉加勒比 | 欧美韩国一区| 欧美网站在线观看| 久久夜精品va视频免费观看| 嫩草伊人久久精品少妇av杨幂| 亚洲一区三区电影在线观看| 亚洲欧美资源在线| 99国产精品久久久久老师| 午夜欧美电影在线观看| 99视频在线观看一区三区| 欧美一级精品大片| 正在播放亚洲| 久久久久久夜| 欧美一区午夜精品| 欧美剧在线免费观看网站| 久久全球大尺度高清视频| 欧美午夜激情视频| 亚洲激情在线观看视频免费| 狠狠色丁香婷婷综合影院| 一区二区三区不卡视频在线观看| 亚洲国产91| 欧美一区二视频| 亚洲一区亚洲二区| 欧美欧美天天天天操| 欧美高清在线视频| 怡红院av一区二区三区| 欧美亚洲在线视频| 性刺激综合网| 国产精品高清网站| 99精品国产热久久91蜜凸| 亚洲国产va精品久久久不卡综合| 午夜视频在线观看一区二区三区 | 免费日韩av片| 伊人夜夜躁av伊人久久| 久久成人一区| 久久久久久久久久久久久女国产乱| 欧美日韩国产电影| 亚洲人成欧美中文字幕| 亚洲久久成人| 欧美成人免费在线| 亚洲国产精品尤物yw在线观看 | 欧美精品1区2区3区| 欧美国产精品一区| 亚洲欧洲精品一区二区三区| 黄网站免费久久| 久久成人av少妇免费| 欧美在线播放一区| 国产女人精品视频| 亚洲欧美三级伦理| 久久视频在线免费观看| 狠狠噜噜久久| 免费亚洲一区| 亚洲欧洲在线播放| 亚洲无线一线二线三线区别av| 欧美人与禽性xxxxx杂性| 日韩一区二区精品葵司在线| 亚洲自拍偷拍色片视频| 国产乱码精品| 久久一区亚洲| 亚洲卡通欧美制服中文| 欧美一区二区黄色| 精品二区视频| 欧美日韩成人综合天天影院| 一区二区三区精品久久久| 欧美在线二区| 亚洲成色999久久网站| 久久久国产精品一区二区中文 | 久久精品99国产精品日本| 开元免费观看欧美电视剧网站| 在线精品福利| 欧美日韩一二三四五区| 亚洲一级片在线看| 久久婷婷影院| 日韩午夜免费| 国产日韩av高清| 欧美国产视频在线| 亚洲欧美自拍偷拍| 亚洲三级网站| 久久噜噜噜精品国产亚洲综合 | 欧美日韩国产综合网| 先锋影音网一区二区| 亚洲人成亚洲人成在线观看| 欧美亚洲自偷自偷| 亚洲人午夜精品免费| 国产亚洲精品bv在线观看| 欧美激情一区二区三区在线| 亚洲欧美综合精品久久成人 | 欧美在线视频观看免费网站| 亚洲精品日韩综合观看成人91| 国产精品久久77777| 久久综合亚州| 香蕉久久精品日日躁夜夜躁| 亚洲精品国产精品乱码不99| 久久久噜噜噜久久久| 亚洲欧美日韩精品久久| 亚洲精选一区| 亚洲国产一二三| 国产又爽又黄的激情精品视频| 国产精品豆花视频|