2014-03-25 79 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文件名在一起,或者只是通過完全限定名作爲參數(雙引號括起來)