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

隨筆-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>
            亚洲视频 欧洲视频| 亚洲激情社区| 欧美日韩一区二区在线观看| 久久精品午夜| 国产精品国产a| 亚洲日本一区二区三区| 激情欧美丁香| 亚洲欧美日韩在线不卡| 亚洲午夜久久久| 欧美激情免费观看| 欧美国产日韩一区二区在线观看 | 久久久水蜜桃av免费网站| 中日韩男男gay无套| 欧美高清在线播放| 欧美好骚综合网| 精品av久久久久电影| 亚欧美中日韩视频| 久久久99久久精品女同性| 国产精品人人做人人爽人人添| 亚洲日本成人| 日韩图片一区| 欧美日韩成人网| 最新69国产成人精品视频免费| **网站欧美大片在线观看| 久久人人爽人人爽| 噜噜噜躁狠狠躁狠狠精品视频| 国产亚洲精品成人av久久ww| 午夜免费在线观看精品视频| 欧美在线播放一区| 国产一区二区剧情av在线| 欧美一级成年大片在线观看| 久久精品av麻豆的观看方式| 国产一区二区三区在线播放免费观看| 亚洲影院在线观看| 久久不射电影网| 国产在线播精品第三| 久久久久久免费| 欧美成人69av| 99一区二区| 欧美日韩在线视频一区| 一区二区三区不卡视频在线观看 | 亚洲欧美国产不卡| 国产精品观看| 欧美一激情一区二区三区| 久久亚洲精选| 9l视频自拍蝌蚪9l视频成人| 欧美性猛交视频| 欧美一区二区三区日韩视频| 欧美大片第1页| 一区二区三区欧美视频| 国产欧美精品一区| 久久躁狠狠躁夜夜爽| 亚洲人体影院| 午夜日韩电影| 亚洲国产精品激情在线观看| 欧美日韩福利视频| 亚洲欧美日韩一区| 欧美激情成人在线| 亚洲专区国产精品| 一区二区在线不卡| 欧美日韩国产123区| 午夜精品久久久久久久白皮肤 | 精品成人乱色一区二区| 欧美大胆a视频| 亚洲男人的天堂在线| 欧美成人国产| 欧美一级一区| 亚洲每日在线| 国产亚洲毛片在线| 欧美黄色大片网站| 先锋影音久久久| 亚洲美女中出| 老色鬼久久亚洲一区二区| 亚洲欧美激情视频| 亚洲国产精品va在线看黑人动漫| 欧美日韩亚洲国产一区| 久久人人97超碰国产公开结果| 美女久久网站| 性欧美长视频| 国产日韩亚洲欧美综合| 欧美高清影院| 久久久久国产免费免费| 亚洲天堂网在线观看| 欧美二区在线观看| 久久精品综合一区| 亚洲一区二区三区午夜| 精品91在线| 国产视频久久久久久久| 欧美午夜精品一区| 欧美成人午夜剧场免费观看| 久久不射网站| 午夜精品久久久久久久久| 在线视频日韩| 亚洲精品网站在线播放gif| 欧美成人免费大片| 久久最新视频| 久久精品一本| 久久精品夜色噜噜亚洲aⅴ| 亚洲欧美日本视频在线观看| 亚洲网友自拍| 一区二区三区国产在线观看| 亚洲人午夜精品| 亚洲国产成人高清精品| 一区国产精品| 一区二区自拍| 亚洲电影免费在线观看| 伊人久久亚洲热| 在线成人av.com| 亚洲大胆女人| 亚洲精选91| 一区二区高清| 亚洲午夜视频| 亚洲欧美中文字幕| 篠田优中文在线播放第一区| 久久99伊人| 久久精品国产77777蜜臀| 久久狠狠婷婷| 久久综合九色| 欧美韩日精品| 亚洲激情在线视频| 99精品99久久久久久宅男| 一本一本a久久| 亚洲欧美国产毛片在线| 欧美一区二区成人| 久久精品一区四区| 猫咪成人在线观看| 欧美激情国产日韩精品一区18| 欧美日韩国语| 国产精品乱码妇女bbbb| 国产欧美一区二区三区在线老狼| 国产亚洲精久久久久久| 亚洲福利视频一区| 亚洲免费电影在线观看| 亚洲一区影音先锋| 欧美一区免费视频| 麻豆精品网站| 日韩写真视频在线观看| 午夜国产精品视频免费体验区| 久久精品国产亚洲5555| 欧美成人精品在线播放| 国产精品国产精品国产专区不蜜| 国产午夜精品久久久久久久| 亚洲国产综合视频在线观看| 亚洲欧美另类综合偷拍| 久久综合婷婷| 夜夜精品视频一区二区| 久久久精品2019中文字幕神马| 欧美xxxx在线观看| 国产伦理一区| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲一区二区三区在线看| 久久久国产视频91| 亚洲精品视频在线观看免费| 欧美亚洲视频| 欧美精品123区| 国产一区二区黄色| 亚洲先锋成人| 亚洲第一中文字幕在线观看| 亚洲欧美在线免费| 欧美日韩在线一区二区三区| 在线观看日韩国产| 欧美一区二区三区四区高清| 亚洲国产成人porn| 久久精品女人天堂| 国产精品午夜在线观看| 日韩一级网站| 免费亚洲电影| 欧美一区在线看| 欧美午夜一区二区三区免费大片| 亚洲福利久久| 久久久久久久网| 亚洲一区二区三区免费在线观看| 欧美福利一区二区三区| 黄色工厂这里只有精品| 亚洲男人天堂2024| 野花国产精品入口| 欧美日韩国产成人| 亚洲免费高清| 亚洲国产精品va在看黑人| 久久精品亚洲| 国产亚洲人成a一在线v站| 午夜精品一区二区在线观看| 夜夜爽av福利精品导航| 欧美成人有码| 91久久一区二区| 欧美激情中文字幕乱码免费| 久久国产精品99国产精| 国产欧美精品一区二区色综合 | 国产精品亚洲视频| 亚洲午夜精品国产| 一本色道久久综合| 欧美日韩三区| 一区二区三区精品国产| 亚洲黄色在线观看| 欧美激情中文字幕乱码免费| 亚洲三级免费电影| 亚洲精品国产精品国自产在线 | 亚洲三级免费电影| 欧美国产精品中文字幕| 亚洲精品一区二区三区不|