用空格参数(Arguments with spaces)

2019-10-19 16:42发布

我想一些参数传递给一个小程序,我写的。 它是一种程序,预计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

Answer 1:

命令行参数是空格分隔。

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

唯一的例外情况是当争吵结束于\在这种情况下,你必须与其他逃避这个\

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

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或只是通过完全限定名作为参数(括在双引号)



Answer 2:

问题是,当我使用以防万一第一个参数报价,我其实是逃避关闭qoute:

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

现在,这正常工作:

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

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



Answer 3:

该参数解析HAR转义字符一些奇怪的规则,它是\"中引起该问题的争论字符组合,这是与一个问题CommandLineToArgvW在Windows的方法。例如,见文章命令行ARGS在\结束”受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


文章来源: Arguments with spaces