带空格的参数

时间:2014-03-25 20:30:15

标签: vb.net .net-3.5

我想把一些参数传递给我写的一个小程序。 它是一个需要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

3 个答案:

答案 0 :(得分:5)

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

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

例外情况是当参数以\结尾时,在这种情况下你必须用另一个\

来转义

所以在你的情况下,这就是你需要的:

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将目录和文件名一起添加,或者只传递完全限定名称作为参数(用双引号括起来)

答案 1 :(得分:2)

问题是,当我使用引号arround第一个参数时,我实际上是在逃避关闭qoute:

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

现在效果很好:

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

结合将\ _放在程序代码中

答案 2 :(得分:0)

该参数解析了一些用于转义字符的奇怪规则,它是导致问题的参数中的\"字符组合。这是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