<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=167856&amp;view=findpost&amp;p=1416601</guid>
        <pubDate>Wed, 17 Jan 2007 08:11:46 +0000</pubDate>
        <title>Как отпарсить командную строку</title>
        <link>https://forum.sources.ru/index.php?showtopic=167856&amp;view=findpost&amp;p=1416601</link>
        <description><![CDATA[ANDLL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=167856&view=findpost&p=1416310'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Executioner &#064; <time class="tag-quote__quoted-time" datetime="2007-01-17T01:58:49+03:00">16.01.07, 22:58</time></span><div class='quote '>у меня по-лучше будет, наверно...</div></div>Наверное, интересно только, чем?<br>
<span class='tag-size' data-value='8' style='font-size:8pt;'>Про то что в своем парсере можно чтото поменять по вкусу мне говорить не надо.</span>]]></description>
        <author>ANDLL</author>
        <category>Visual Basic: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=167856&amp;view=findpost&amp;p=1416325</guid>
        <pubDate>Tue, 16 Jan 2007 23:32:55 +0000</pubDate>
        <title>Как отпарсить командную строку</title>
        <link>https://forum.sources.ru/index.php?showtopic=167856&amp;view=findpost&amp;p=1416325</link>
        <description><![CDATA[B.V.: На всякий случай: <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=148087' target='_blank'>[VB 6] Парсер командной строки</a>]]></description>
        <author>B.V.</author>
        <category>Visual Basic: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=167856&amp;view=findpost&amp;p=1416310</guid>
        <pubDate>Tue, 16 Jan 2007 22:58:49 +0000</pubDate>
        <title>Как отпарсить командную строку</title>
        <link>https://forum.sources.ru/index.php?showtopic=167856&amp;view=findpost&amp;p=1416310</link>
        <description><![CDATA[Executioner: у меня по-лучше будет, наверно...<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Option Explicit</div><div class="code_line">&nbsp;</div><div class="code_line">Private Type cmdArgument</div><div class="code_line">&nbsp;&nbsp;Name As String</div><div class="code_line">&nbsp;&nbsp;Value As String</div><div class="code_line">End Type</div><div class="code_line">&nbsp;</div><div class="code_line">Dim CmdLineArgs() As cmdArgument</div><div class="code_line">Dim lNumberOfArguments As Long</div><div class="code_line">Const csDoubleQuote As String = &quot;&quot;&quot;&quot;</div><div class="code_line">Const csSingleQuote As String = &quot;&#39;&quot;</div><div class="code_line">Const csSeparator As String = &quot; &quot;</div><div class="code_line">&nbsp;</div><div class="code_line">Private Function GetCommandLine()</div><div class="code_line">&#39;if you want to use MaxNumberArgs uncomment this line and line</div><div class="code_line">&#39;at the end of this function</div><div class="code_line">&#39;(Optional MaxNumberArgs As Long = 10)</div><div class="code_line">&nbsp;</div><div class="code_line">&#39;GetCommandLine function parses command line arguments ie their names and values</div><div class="code_line">&#39;CmdLine= [argName1=]argValue1[&#60;space&#62;[argName2=]argValue2... ]</div><div class="code_line">&#39;or if argValue contains space(s)</div><div class="code_line">&#39;it should be in &quot; &quot;(double quotes)or in single quotes(&#39; &#39;)</div><div class="code_line">&#39;CmdLine= [argName1=]&quot;arg Value1&quot;[&#60;space&#62;[argName2=]&#39;arg Value2&#39;... ]</div><div class="code_line">&#39;into collection colCmdLineArgs</div><div class="code_line">&nbsp;</div><div class="code_line">&#39;Dim colCmdLineArgs As Collection</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">Dim sCmdArg As String</div><div class="code_line">Dim lNextSeparatorPosition As Long</div><div class="code_line">&#39;Declare variables.</div><div class="code_line">Dim sChar, sPrevChar As String</div><div class="code_line">Dim sCommandLine As String</div><div class="code_line">Dim lOpenQuotePosition As Long</div><div class="code_line">Dim lCloseQuotePosition As Long</div><div class="code_line">Dim bArgInQuots As Boolean</div><div class="code_line">&nbsp;</div><div class="code_line">Dim lCommandLineLength As Long</div><div class="code_line">&nbsp;</div><div class="code_line">Dim CmdLine, CmdLnLen, InArg, i, NumArgs</div><div class="code_line">&nbsp;</div><div class="code_line">1: sCommandLine = Trim(Command()) &amp; csSeparator</div><div class="code_line">2: lCommandLineLength = Len(sCommandLine)</div><div class="code_line">3: Do Until lCommandLineLength &#60;= Len(csSeparator)</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">4: &nbsp; &nbsp;lNextSeparatorPosition = InStr(1, sCommandLine, csSeparator)</div><div class="code_line">5: &nbsp; &nbsp;lOpenQuotePosition = getNextQuotePosition(sCommandLine)</div><div class="code_line">6: &nbsp; &nbsp;lCloseQuotePosition = getNextQuotePosition(sCommandLine, lOpenQuotePosition + 1)</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;If (lOpenQuotePosition &#60; lNextSeparatorPosition) And _</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; (lCloseQuotePosition &#62; lNextSeparatorPosition) Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;&#39;there is &nbsp;separator in quotes</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;&#39;then find real argument separator</div><div class="code_line">7: &nbsp; &nbsp; &nbsp; lNextSeparatorPosition = InStr(lCloseQuotePosition, sCommandLine, csSeparator)</div><div class="code_line">8: &nbsp; &nbsp; &nbsp; &nbsp;If lNextSeparatorPosition &#60;&#62; lCloseQuotePosition + 1 Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;wrong quote position</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#39;Err.Raise</div><div class="code_line">9: &nbsp; &nbsp; &nbsp; &nbsp;End If</div><div class="code_line">10: &nbsp; &nbsp;End If</div><div class="code_line">11: &nbsp; &nbsp;sCmdArg = Trim(Left(sCommandLine, lNextSeparatorPosition))</div><div class="code_line">12: &nbsp; &nbsp;sCommandLine = Trim(Right(sCommandLine, lCommandLineLength - lNextSeparatorPosition)) &amp; csSeparator</div><div class="code_line">13: &nbsp; &nbsp;lCommandLineLength = Len(sCommandLine)</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;increment &nbsp;NumberOfArguments</div><div class="code_line">14: &nbsp; &nbsp;lNumberOfArguments = lNumberOfArguments + 1</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">15: &nbsp; &nbsp;ReDim Preserve CmdLineArgs(1 To lNumberOfArguments)</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;set the Arg Name and Value</div><div class="code_line">16: &nbsp; &nbsp;CmdLineArgs(lNumberOfArguments) = getCmdArg(sCmdArg)</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&#39; ----</div><div class="code_line">&#39;uncomment this line if you want to use MaxNumberArgs</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;If lNumberOfArguments = MaxNumberArgs Then Exit Do</div><div class="code_line">17: Loop</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">End Function</div><div class="code_line">&nbsp;</div><div class="code_line">Private Function getCmdArg(sArgString As String) As cmdArgument</div><div class="code_line">1: On Error GoTo ErrorHandler</div><div class="code_line">Dim sArgName As String</div><div class="code_line">Dim sArgValue As String</div><div class="code_line">Dim lEqualSignPosition As Long</div><div class="code_line">&#39;Dim sArgName</div><div class="code_line">&#39;open qoute</div><div class="code_line">Dim s1Quote As String</div><div class="code_line">&#39;close qoute</div><div class="code_line">Dim s2Quote As String</div><div class="code_line">&nbsp;</div><div class="code_line">2: sArgString = Trim(sArgString)</div><div class="code_line">3: lEqualSignPosition = InStr(1, sArgString, &quot;=&quot;)</div><div class="code_line">4: If lEqualSignPosition = 0 Then</div><div class="code_line">&#39;there is no sArgName</div><div class="code_line">5: &nbsp; &nbsp;sArgName = &quot;&quot;</div><div class="code_line">6: &nbsp; &nbsp;sArgValue = sArgString</div><div class="code_line">7: Else</div><div class="code_line">&#39;there is sArgName</div><div class="code_line">8: &nbsp; &nbsp;sArgName = Left(sArgString, lEqualSignPosition - 1)</div><div class="code_line">9: &nbsp; &nbsp;sArgValue = Right(sArgString, Len(sArgString) - lEqualSignPosition)</div><div class="code_line">10: End If</div><div class="code_line">&nbsp;</div><div class="code_line">&#39;check if there is(are) qoutes or double qoutes in sArgValue</div><div class="code_line">11: s1Quote = Left(sArgValue, 1)</div><div class="code_line">12: If s1Quote = csSingleQuote Or s1Quote = csDoubleQuote Then</div><div class="code_line">&#39;if there is leading quot get rid of it</div><div class="code_line">13: &nbsp;sArgValue = Right(sArgValue, Len(sArgValue) - 1)</div><div class="code_line">14: End If</div><div class="code_line">&nbsp;</div><div class="code_line">15: s2Quote = Right(sArgValue, 1)</div><div class="code_line">16: If s2Quote = csSingleQuote Or s2Quote = csDoubleQuote Then</div><div class="code_line">&#39;if there is trailing quot get rid of it</div><div class="code_line">17: &nbsp;sArgValue = Left(sArgValue, Len(sArgValue) - 1)</div><div class="code_line">18: End If</div><div class="code_line">&#39;set return User Define type</div><div class="code_line">19: getCmdArg.Name = sArgName</div><div class="code_line">20: getCmdArg.Value = sArgValue</div><div class="code_line">21: Exit Function</div><div class="code_line">&nbsp;</div><div class="code_line">ErrorHandler:</div><div class="code_line">&nbsp;</div><div class="code_line">End Function</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">Private Function getNextQuotePosition(ByVal sCommandLine As String, Optional BeginWithPosition As Long = 1) As Long</div><div class="code_line">1: On Error GoTo Error_Handler</div><div class="code_line">Dim lSingleQuotePos As Long</div><div class="code_line">Dim lDoubleQuotePos As Long</div><div class="code_line">&nbsp;</div><div class="code_line">2: lSingleQuotePos = InStr(BeginWithPosition, sCommandLine, csSingleQuote)</div><div class="code_line">3: lDoubleQuotePos = InStr(BeginWithPosition, sCommandLine, csDoubleQuote)</div><div class="code_line">&nbsp;</div><div class="code_line">If (lSingleQuotePos &#60; lDoubleQuotePos And _</div><div class="code_line">&nbsp;&nbsp; &nbsp;lSingleQuotePos &#62; 0 And lDoubleQuotePos &#62; 0) Or lDoubleQuotePos = 0 Then</div><div class="code_line">&#39;</div><div class="code_line">4: &nbsp;getNextQuotePosition = lSingleQuotePos</div><div class="code_line">5: Else</div><div class="code_line">&#39;if no single quote</div><div class="code_line">&#39;or single quote and double quote exit and lDoubleQuotePos &#60;lSingleQuotePos</div><div class="code_line">&nbsp;</div><div class="code_line">6: &nbsp;getNextQuotePosition = lDoubleQuotePos</div><div class="code_line">7: End If</div><div class="code_line">8: Exit Function</div><div class="code_line">&nbsp;</div><div class="code_line">Error_Handler:</div><div class="code_line">&nbsp;</div><div class="code_line">End Function</div><div class="code_line">&nbsp;</div><div class="code_line">Public Function CountArguments() As Long</div><div class="code_line">1: CountArguments = lNumberOfArguments</div><div class="code_line">End Function</div><div class="code_line">&nbsp;</div><div class="code_line">Public Function GetArgumentName(ByVal CmdArgNumber As Long) As String</div><div class="code_line">1: If CmdArgNumber &#62; 0 And CmdArgNumber &#60;= lNumberOfArguments Then</div><div class="code_line">2: &nbsp;GetArgumentName = CmdLineArgs(CmdArgNumber).Name</div><div class="code_line">3: End If</div><div class="code_line">End Function</div><div class="code_line">&nbsp;</div><div class="code_line">Public Function GetArgumentNumber(ByVal CmdArgName As String) As Long</div><div class="code_line">Dim iSubscript As Long</div><div class="code_line">1: For iSubscript = 1 To lNumberOfArguments</div><div class="code_line">2: &nbsp; &nbsp;If CmdLineArgs(iSubscript).Name = CmdArgName Then</div><div class="code_line">3: &nbsp; &nbsp; &nbsp;GetArgumentNumber = iSubscript</div><div class="code_line">4: &nbsp; &nbsp; &nbsp;Exit For</div><div class="code_line">5: &nbsp; &nbsp;End If</div><div class="code_line">6: Next</div><div class="code_line">End Function</div><div class="code_line">&nbsp;</div><div class="code_line">Public Function GetArgumentValue(ByVal CmdArgNameOrNumber As Variant) As String</div><div class="code_line">Dim iSubscript As Long</div><div class="code_line">1: If IsNumeric(CmdArgNameOrNumber) Then</div><div class="code_line">2: &nbsp;If CInt(CmdArgNameOrNumber) &#62;= 1 And CInt(CmdArgNameOrNumber) &#60;= lNumberOfArguments Then</div><div class="code_line">3: &nbsp;GetArgumentValue = CmdLineArgs(CInt(CmdArgNameOrNumber)).Value</div><div class="code_line">4: &nbsp;End If</div><div class="code_line">5: Else</div><div class="code_line">6: &nbsp;For iSubscript = 1 To lNumberOfArguments</div><div class="code_line">7: &nbsp; &nbsp;If CmdLineArgs(iSubscript).Name = CmdArgNameOrNumber Then</div><div class="code_line">8: &nbsp; &nbsp; &nbsp;GetArgumentValue = CmdLineArgs(iSubscript).Value</div><div class="code_line">9: &nbsp; &nbsp; &nbsp;Exit For</div><div class="code_line">10: &nbsp; &nbsp;End If</div><div class="code_line">11: &nbsp;Next</div><div class="code_line">12: End If</div><div class="code_line">End Function</div><div class="code_line">&nbsp;</div><div class="code_line">Private Sub Class_Initialize()</div><div class="code_line">1: Call GetCommandLine</div><div class="code_line">End Sub</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Executioner</author>
        <category>Visual Basic: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=167856&amp;view=findpost&amp;p=1411763</guid>
        <pubDate>Sat, 13 Jan 2007 16:31:12 +0000</pubDate>
        <title>Как отпарсить командную строку</title>
        <link>https://forum.sources.ru/index.php?showtopic=167856&amp;view=findpost&amp;p=1411763</link>
        <description><![CDATA[ANDLL: Вам никогда не приходило в голову написать свой парсер командной строки?<br>
Который бы разбирал что-то типа <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">a b &quot;x\&quot;x&quot; 555</div></ol></div></div></div></div>Если приходилось то вы знаете, как это &quot;приятно&quot;.<br>
Однако, в windows уже есть функция, которое все распарсит сама.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Option Explicit</div><div class="code_line">Private Declare Function CommandLineToArgvW Lib &quot;shell32.dll&quot; (ByVal nInput As Long, ByRef retcount As Long) As Long</div><div class="code_line">Private Declare Function LocalFree Lib &quot;kernel32&quot; (ByVal hMem As Long) As Long</div><div class="code_line">Private Declare Function SysAllocString Lib &quot;oleaut32&quot; (ByVal nString As Long) As Long</div><div class="code_line">Private Declare Sub CopyMemory Lib &quot;kernel32&quot; Alias &quot;RtlMoveMemory&quot; (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)</div><div class="code_line">&nbsp;</div><div class="code_line">Public Function CommandLineToArgvVB(ByVal nInput As String) As String()</div><div class="code_line">&nbsp;&nbsp; &nbsp;Dim ret As Long, retcount As Long, rt() As String, I As Integer, lng As Long</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret = CommandLineToArgvW(StrPtr(nInput), retcount)</div><div class="code_line">&nbsp;&nbsp; &nbsp;If retcount &#62; 0 Then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ReDim rt(retcount - 1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;For I = 0 To UBound(rt)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CopyMemory VarPtr(lng), ret + I * 4, 4</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CopyMemory VarPtr(rt(I)), VarPtr(SysAllocString(lng)), 4</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Next</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CommandLineToArgvVB = rt</div><div class="code_line">&nbsp;&nbsp; &nbsp;End If</div><div class="code_line">&nbsp;&nbsp; &nbsp;If ret &#60;&#62; 0 Then LocalFree ret</div><div class="code_line">End Function</div></ol></div></div></div></div><br>
Использование:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Private Sub Form_Load()</div><div class="code_line">&nbsp;&nbsp; &nbsp;Dim ret() As String, I As Long</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret = CommandLineToArgvVB(&quot;a b &quot;&quot;xx yy&quot;&quot; \&quot;&quot;abc&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;MsgBox Join(ret, vbCrLf)</div><div class="code_line">&nbsp;&nbsp; &nbsp;End</div><div class="code_line">End Sub</div></ol></div></div></div></div>]]></description>
        <author>ANDLL</author>
        <category>Visual Basic: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	