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

隨筆-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) 閱讀(2205) 評論(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>
            亚洲影视综合| 久久久精品999| 欧美日韩日本国产亚洲在线| 91久久久精品| 欧美黄色视屏| 欧美激情一区二区三区在线视频| 亚洲国产另类精品专区| 欧美高清不卡| 欧美激情一区| 亚洲综合精品四区| 欧美亚洲在线视频| 亚洲电影免费观看高清| 亚洲国产电影| 欧美日韩第一页| 香蕉久久精品日日躁夜夜躁| 亚洲欧美中文日韩在线| 国产亚洲一区二区精品| 欧美国产日本| 国产精品av免费在线观看| 欧美一区二区免费观在线| 久久国产精品久久久久久| 亚洲日本成人| 中文av一区二区| 精品二区久久| 亚洲美洲欧洲综合国产一区| 国产伦一区二区三区色一情| 老司机精品福利视频| 欧美国产三区| 久久久久久久久久看片| 欧美日本韩国一区| 欧美自拍偷拍| 欧美人与性禽动交情品 | 久久一二三国产| 亚洲精品社区| 亚洲欧美中文另类| 一区二区精品在线观看| 欧美一区在线视频| 中文久久精品| 久久免费视频在线观看| 亚洲综合视频1区| 久久综合给合久久狠狠色| 亚洲男人的天堂在线aⅴ视频| 久久久国产亚洲精品| 亚洲女同同性videoxma| 欧美成人一区二区在线| 久久久久久一区二区三区| 国产精品福利片| 亚洲欧洲精品一区二区三区| 国产综合欧美在线看| 一区二区三区回区在观看免费视频| 精品96久久久久久中文字幕无| 一本色道久久综合亚洲精品婷婷| 亚洲福利专区| 久久激情五月激情| 欧美一区二区三区在线观看| 欧美日韩一区二区三区视频 | 99精品欧美| 久久久国产精彩视频美女艺术照福利| 一区二区三区四区五区精品| 美女网站久久| 男人的天堂亚洲在线| 国产亚洲a∨片在线观看| 亚洲综合视频一区| 午夜精品免费视频| 国产精品美女999| 一区二区三区四区精品| 亚洲视频在线观看免费| 欧美精品亚洲精品| 亚洲精品一区二| 99精品国产热久久91蜜凸| 欧美99久久| 亚洲人成人99网站| 亚洲六月丁香色婷婷综合久久| 美女久久网站| 亚洲国产日韩欧美在线99 | 国产精品久久久久7777婷婷| 亚洲精品一级| 亚洲综合色激情五月| 欧美性猛交xxxx乱大交蜜桃 | 免费成人黄色av| 激情综合激情| 久久综合网hezyo| 欧美激情影音先锋| 亚洲最新色图| 国产精品国产三级欧美二区| 亚洲一级片在线观看| 欧美在线黄色| 在线播放中文一区| 欧美xxx成人| 一区二区欧美精品| 久久精品伊人| 亚洲精品护士| 国产精品你懂的| 久久久久久久成人| 亚洲免费观看| 欧美在线视频日韩| 在线精品一区| 欧美日韩福利视频| 欧美一区二区三区视频免费播放 | 一本色道久久综合亚洲精品高清| 欧美日韩免费观看中文| 亚洲欧美日韩国产一区二区三区| 久久精品在线观看| 亚洲精品国产精品国自产在线 | 性色av一区二区三区| 裸体丰满少妇做受久久99精品| 亚洲日本视频| 国产精品乱人伦中文| 久久久青草婷婷精品综合日韩| 91久久久久久久久| 久久国产色av| 亚洲精品在线电影| 国产欧美高清| 欧美国产欧美亚洲国产日韩mv天天看完整| 宅男噜噜噜66国产日韩在线观看| 久久一区激情| 亚洲欧美日韩在线观看a三区| 黄色亚洲在线| 国产精品久久久久一区二区三区共| 久久久国产精品亚洲一区| 亚洲视频狠狠| 亚洲成色777777在线观看影院| 午夜亚洲福利| 日韩午夜激情av| 亚洲高清免费| 国内精品久久久久久久影视蜜臀 | 欧美在线视频一区| 在线亚洲欧美| 亚洲精品视频在线播放| 美女主播精品视频一二三四| 欧美一级视频| 亚洲欧美一区二区激情| 99视频精品| 亚洲日本欧美日韩高观看| 国语自产精品视频在线看一大j8| 国产精品久久久久久久久免费樱桃 | 亚洲国产成人tv| 麻豆视频一区二区| 久久九九99视频| 久久经典综合| 欧美一区二区精美| 亚洲欧美日韩国产中文| 亚洲欧美国产高清| 亚洲视频在线观看网站| 亚洲图片欧洲图片av| 中文在线资源观看网站视频免费不卡| 亚洲人成网站777色婷婷| 在线欧美福利| 136国产福利精品导航网址| 一区在线播放| 在线精品视频免费观看| 在线国产精品播放| 亚洲国产一区二区精品专区| 亚洲国产成人一区| 亚洲日本欧美日韩高观看| 亚洲日本视频| 亚洲天堂成人| 欧美亚洲自偷自偷| 久久久久久久久久码影片| 久久久久欧美精品| 欧美国产精品中文字幕| 亚洲电影在线播放| 日韩视频一区二区在线观看 | 性欧美超级视频| 久久国产夜色精品鲁鲁99| 久久久久久久久岛国免费| 久久综合九色九九| 亚洲福利视频专区| 亚洲精品视频一区二区三区| 亚洲视频第一页| 欧美综合国产精品久久丁香| 久久久青草婷婷精品综合日韩| 免播放器亚洲| 国产精品成人国产乱一区 | 久久黄色小说| 免费观看在线综合| 国产精品xnxxcom| 国产亚洲欧美激情| 亚洲欧洲另类| 午夜日韩在线| 欧美国产日本韩| 亚洲视屏一区| 久久亚洲综合色| 国产精品成人一区二区| 韩国一区二区三区在线观看| 艳女tv在线观看国产一区| 香蕉精品999视频一区二区| 免费日韩视频| 亚洲尤物影院| 欧美激情欧美激情在线五月| 国产精品自拍在线| 亚洲精品一区二区三区四区高清| 亚洲直播在线一区| 欧美www视频在线观看| 亚洲少妇自拍| 欧美另类一区| 在线日韩视频| 性做久久久久久久免费看| 亚洲韩国青草视频| 久久免费99精品久久久久久|