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