2012-10-27 37 views
2

我試圖調用使用工藝外部程序:vb.net如何使用空格的字符串傳遞給命令行

Dim strExe As String = "E:\Projects\Common Files\mktorrent.exe" 
    Dim p As New Process 
    Dim pinfo As New ProcessStartInfo 
    pinfo.UseShellExecute = False 
    pinfo.RedirectStandardOutput = True 
    pinfo.Arguments = " -a http://blah.com/announce.php -l " & FileSizeMarker & " " & fn 
    pinfo.FileName = strExe 
    pinfo.WorkingDirectory = fn.Substring(0, fn.LastIndexOf("\")) 
    pinfo.WindowStyle = ProcessWindowStyle.Normal 
    pinfo.CreateNoWindow = True 
    p.StartInfo = pinfo 
    p.Start() 

問題是與該文件名(上述可變FN)。如果它有空格,命令扼流圈 - 沒有空格,它工作正常。我曾嘗試加入1,2個或3引號,像這樣:

fn = Chr(34) & Chr(34) & Chr(34) & fn & Chr(34) & Chr(34) & Chr(34) 

fn = "\") & Chr(34) & fn & "\"& Chr(34) 

等多種組合方式,但它仍然給我一個錯誤。關於如何讓這個工作的任何想法? TIA

+0

P.S.我也試過單引號... – Chiwda

+0

我被迫用「_」(下劃線)替換空格來解決這個問題。但是因爲目錄名也可以有空格,所以我必須先將文件名與目錄名分開,用「_」(下劃線)而不是「」來重命名該文件,然後添加目錄名,然後運行mktorrent。這工作,因爲我正在改變工作目錄到我正在torrenting的文件,所以路徑變得無關緊要。多麼愚蠢的黑客! :-( – Chiwda

回答

1

的Windows不提供保持參數用空格作爲單個參數的常用方法。然而,你已經嘗試了一些相對常見的標準。

因此,要麼確定參數處理mktorrent.exe使用什麼參數,或者當您嘗試傳遞文件名時,使用「MSDOS」8.3格式作爲沒有空格的路徑。

對於後者,this answer指向Win32API GetShortPathName

當然,8.3文件名可以禁用現代Windows(我相信所有基於Windows NT的系統 - 通常不是)。所以你唯一的完整的解決方案是確定什麼參數處理mktorrent供應。

由於您的評論暗示行情不被穿過我證實了我在VBScript中的MsgBox輸出看到'testing' 'testing' '1 2 3'

Dim strExe As String = "C:\Windows\System32\wscript.exe" 
Dim p As New Process 
Dim pinfo As New ProcessStartInfo 
pinfo.UseShellExecute = False 
pinfo.RedirectStandardOutput = True 
pinfo.Arguments = " G:\Utils\Arguments.vbs testing ""testing"" ""1 2 3""" 
pinfo.FileName = strExe 
pinfo.WorkingDirectory = "G:\Utils" 
pinfo.WindowStyle = ProcessWindowStyle.Normal 
pinfo.CreateNoWindow = True 
p.StartInfo = pinfo 
p.Start() 

所以wscript是看到:

Option Explicit 

Dim arg 
Dim line 

For Each arg in WScript.Arguments 
    line = line & " '" & arg & "'" 
Next 

MsgBox Trim(line) 

使用執行時引號併爲腳本積累了三個參數。

順便說一句我剛剛注意到你的例子試圖獲取文件名附近的引號修改fn變量。你是否用.WorkingDirectory這一行來滿足這個要求,它應該使用未修改的文件名?

+0

假設它是同一個程序的相同版本,請注意示例[here](http://wiki.bytesized-hosting.com/wiki/index.php/ Mktorrent)從文件名中刪除當前目錄(它仍然有它自己的空格) –

+0

太糟糕了,沒有辦法解決這樣一個簡單的問題。基本上,能夠通過Process方法將引號傳遞到命令行 – Chiwda

0

很簡單:

Process.Start("c:\Your exe file", """" & "string with space" & """") 
0

這讓我通過空格鍵入cmd。研究小時沒有任何結果;這個線程不斷出現,希望這會幫助別人。

Dim startprgm As New ProcessStartInfo("cmd.exe", "/C """"C:\Program Files (x86)\Folder\File""""" + strArguments) 

注意4個雙引號引出的路徑,這部分很重要。用5個引號引出參數(/ C)不起作用,但最後的五個可以分爲4和1;和結構化這樣:

Dim startprgm As New ProcessStartInfo("cmd.exe", "/C """"C:\Program Files (x86)""""\Folder\File" + strArguments) 

如果打開的cmd.exe,只是發送一條命令,你只需要在路徑上的第一次報價(它並不需要被關閉),但VB需要尾隨的到「關閉」引號。

祝你好運,夥計們。

相關問題