2014-03-25 82 views
0

我想将一些参数传递给我写的一个小程序。 其预计2个参数的程序。 当我这样称呼它:带空格的参数

d:\littleProgram.exe d:\test\folder\ test.pdf 

它工作正常。

但当我尝试这个办法:

d:\littleProgram.exe d:\test 2\folder\ test.pdf 

它认为是获得3个参数...

我想引用这样的:

d:\littleProgram.exe "d:\test 2\folder\" test.pdf 

没有运气。

这是VB代码:

Module Module1 
     Sub Main(ByVal sArgs() As String) 
      If sArgs.Length = 0 Then 
       ... some code 
      ElseIf sArgs.Length = 2 Then 
       ... some code 
      End If 
     End Sub 
End Module 
+1

你真的有一个文件名为“test.pdf”?至少浏览器不会允许具有前导或尾随空格的文件名 – Plutonix

+0

@Plutonix:不,在'test 2'文件夹名称中有一个空格。文件名是一个单独的参数,它之前的空格是参数之间的分隔符。 – Guffa

+0

对不起,误读。你在哪里得到这个问题。在IDE或运行时?报价为我工作。 – Plutonix

回答

0

的问题是,当我使用引号角落找寻第一个参数,我其实是逃避收盘qoute:

d:\littleProgram.exe "d:\test 2\folder\" test.pdf 

这个工作现在罚款:

d:\littleProgram.exe "d:\test 2\folder" test.pdf 

与把\程序的代码内线组合

0

的参数解析HAR转义字符一些奇怪的规则,它在引起该问题的论据\"字符组合。这是Windows中的CommandLineToArgvW方法的问题。例如见文章Commandline args ending in \" are subject to CommandLineToArgvW whackiness

获取非解析命令行,解析它来获得参数预期:

Dim arguments As String() = _ 
    Regex.Matches(Environment.CommandLine, "(?:""[^""]*""|[^ ]+)") _ 
    .Cast(Of Match)().Select(Function(m) m.Value).Skip(1).ToArray() 

注:此分析不处理转义为原来的方法序列,这样你就可以在引用参数内部例如使用""\"以在其中放置引号。如果你想用原来的方法,你需要按照它的转义规则和参数都必须写成:

d:\littleProgram.exe "d:\test 2\folder\\" test.pdf 
3

命令行参数是空格分隔的。

如果您需要传递一个参数,例如具有(或可能有)空格的文件名,可以用双引号括起来。

的例外是当争吵与\结束在这种情况下,你必须与其他\

摆脱这种所以你的情况,这是你所需要的:

d:\littleProgram.exe "d:\test 2\folder\\" "test.pdf" 

所以你的代码会是这样的:

For i As Integer = 0 To My.Application.CommandLineArgs.Count - 1 
    Debug.Writeline(My.Application.CommandLineArgs(i)) 
Next 

输出:

d:\test 2\folder\ 
test.pdf 

更简单的方法可能是去掉结尾的斜线,并添加目录和使用Path.Combine文件名在一起,或者只是通过完全限定名作为参数(双引号括起来)