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

隨筆-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>
            久久九九电影| 国产伦精品一区二区三区高清| 免费91麻豆精品国产自产在线观看| 国产酒店精品激情| 久久夜色精品亚洲噜噜国产mv| 性欧美8khd高清极品| 激情综合视频| 中文av一区二区| 一区二区在线看| 9l国产精品久久久久麻豆| 国产欧美日韩一区二区三区在线| 久久九九精品99国产精品| 欧美成人免费小视频| 一区二区毛片| 久久国产精品黑丝| 亚洲影院一区| 男人的天堂成人在线| 西西裸体人体做爰大胆久久久| 久久―日本道色综合久久| 亚洲欧美制服另类日韩| 欧美大学生性色视频| 免费日韩av电影| 国产欧亚日韩视频| 亚洲一区欧美| 欧美一区二区三区播放老司机| 欧美精品黄色| 妖精视频成人观看www| 日韩写真在线| 国产精品久久久久影院亚瑟| 亚洲欧洲一区二区在线播放| 尤妮丝一区二区裸体视频| 亚洲精品国偷自产在线99热| 久久国产手机看片| 欧美综合国产精品久久丁香| 国产精品美女主播在线观看纯欲| 日韩天堂av| 欧美一区二区在线观看| 国产日韩欧美成人| 久久久九九九九| 欧美国产日韩a欧美在线观看| 在线观看欧美| 欧美色综合天天久久综合精品| 最新日韩精品| 亚洲男人第一av网站| 国内成+人亚洲+欧美+综合在线| 久久激情中文| 亚洲国产欧美一区| 亚洲欧美日韩天堂| 精品动漫av| 欧美亚洲成人免费| 久久精品女人的天堂av| 亚洲精选在线| 老司机aⅴ在线精品导航| 亚洲精品少妇30p| 国产一区二区三区精品久久久| 欧美国产精品一区| 亚洲欧美国产制服动漫| 亚洲国产精品视频| 久久se精品一区二区| 亚洲一区二区三区在线播放| 海角社区69精品视频| 国产欧美日韩亚洲一区二区三区| 欧美成人免费一级人片100| 久久av一区二区三区漫画| 亚洲视频一区二区| 亚洲美女黄网| 91久久午夜| 亚洲国产99精品国自产| 欧美成人午夜剧场免费观看| 久久成人人人人精品欧| 欧美日韩亚洲91| 欧美激情乱人伦| 蜜桃精品久久久久久久免费影院| 欧美一区二区视频免费观看 | 久久人91精品久久久久久不卡| 99精品欧美一区二区三区 | 欧美 日韩 国产一区二区在线视频 | 亚洲一区二区三区涩| 日韩一级不卡| 亚洲一区免费看| 亚洲天堂av电影| 亚洲欧美日韩一区在线| 亚洲欧美制服另类日韩| 午夜亚洲视频| 久久久久久9| 欧美国产视频在线| 妖精视频成人观看www| 亚洲一区二区三区视频播放| 久久福利精品| 欧美日韩国产在线看| 国产日本亚洲高清| 亚洲精品久久久久中文字幕欢迎你| 日韩视频免费观看高清在线视频| 一区二区久久久久久| 久久综合色播五月| 日韩一级成人av| 久久在线观看视频| 欧美亚洲第一页| 日韩视频在线播放| 久久久xxx| 午夜精品国产精品大乳美女| 欧美福利一区二区| 极品日韩久久| 美女视频黄免费的久久| 亚洲女人天堂成人av在线| 欧美黄色免费| 久热国产精品| 欧美视频三区在线播放| 亚洲欧洲一区二区在线播放| 久久av在线| 久久国产精品久久w女人spa| 国产精品毛片a∨一区二区三区|国| 亚洲精品欧洲精品| 亚洲欧洲一二三| 欧美日韩一区二区国产| 亚洲私人影吧| 亚洲男人影院| 在线免费日韩片| 欧美激情区在线播放| 欧美黄色aa电影| 亚洲人成亚洲人成在线观看| 亚洲春色另类小说| 亚洲成在人线av| 免费观看30秒视频久久| 久久在线免费观看| 99精品视频一区二区三区| 日韩午夜在线播放| 国内偷自视频区视频综合| 麻豆国产精品va在线观看不卡 | 亚洲男人的天堂在线观看| 夜夜嗨av一区二区三区网页 | 日韩一级欧洲| 国产亚洲综合精品| 亚洲老板91色精品久久| 国产一区二区三区免费观看| 欧美凹凸一区二区三区视频| 欧美黄色片免费观看| 欧美一区在线直播| 欧美成人精品一区二区| 久久精品道一区二区三区| 美腿丝袜亚洲色图| 久久精品人人做人人爽| 欧美国产日韩精品免费观看| 欧美在线观看网址综合| 欧美日韩久久精品| 欧美a级片网站| 精品成人乱色一区二区| 9i看片成人免费高清| 亚洲国产综合91精品麻豆| 欧美影院在线| 欧美自拍偷拍午夜视频| 国产精品久久二区二区| 亚洲精品三级| 宅男精品视频| 欧美午夜免费| 亚洲一二三区精品| 欧美一级理论性理论a| 国产精品高潮呻吟久久av无限| 亚洲精品一区久久久久久 | 国产日韩av高清| 亚洲综合首页| 久久久久久久97| 亚洲国产美女| 欧美日韩国产色视频| 亚洲天堂av高清| 欧美在线国产| 亚洲国产精品一区二区尤物区| 卡一卡二国产精品| 一区二区三区不卡视频在线观看 | 国产色爱av资源综合区| 久久国产精品久久精品国产| 欧美激情一区二区三区高清视频| 亚洲电影免费观看高清| 欧美三级网页| 老鸭窝亚洲一区二区三区| 一区二区日韩精品| 免费欧美日韩| 欧美怡红院视频| 亚洲精品一区二区三区99| 国产精品久久久久91| 欧美大香线蕉线伊人久久国产精品| 一区二区三区蜜桃网| 亚洲人成久久| 欧美高清在线精品一区| 欧美一区二区三区另类| 亚洲精品在线一区二区| 精品999在线观看| 国产乱码精品| 国产精品亚洲综合| 欧美系列一区| 欧美视频一区二| 欧美精品电影| 欧美精品性视频| 亚洲高清不卡| 国产在线欧美日韩| 国产亚洲欧美一区二区| 国产精品少妇自拍| 国产一区二区精品丝袜| 国产一区观看| 精品va天堂亚洲国产|