vb.net如何将带空格的字符串传递给命令行

时间:2012-10-27 06:31:18

标签: vb.net process command-line-arguments space

我正在尝试使用Process调用外部程序:

    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

6 个答案:

答案 0 :(得分:1)

请检查以下链接,它在C#中可能对您有帮助

Word command-line-arguments space issues

答案 1 :(得分:1)

Windows 没有提供将空格参数保持为单个参数的常用方法。但是,您尝试过许多相对常见的标准。

因此,无论是确定处理mktorrent.exe处理的参数,还是在尝试传递文件名时,使用“MSDOS”8.3格式作为没有空格的路径。

对于后者,this answer指向Win32API GetShortPathName

当然,使用现代Windows(我认为所有基于Windows NT的系统 - 而不是通常的系统)禁用8.3文件名 。因此,您唯一的完整解决方案是确定处理mktorrent提供的参数。

由于您的评论建议不会传递引号我确认我在此vbscript的'testing' 'testing' '1 2 3'输出中看到了MsgBox

Option Explicit

Dim arg
Dim line

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

MsgBox Trim(line)

使用时执行:

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看到引号并且正在为脚本累积三个参数。

BTW我刚刚注意到你的示例尝试获取文件名周围的引号会修改fn变量。您是否使用.WorkingDirectory行来处理此问题,该行应使用未修改的文件名?

答案 2 :(得分:1)

这允许我将空格传递给cmd。几个小时的研究没有发现;这个帖子经常出现,希望这会帮助别人。

Dim startprgm As New ProcessStartInfo("cmd.exe", "/C """"C:\Program Files (x86)\Folder\File""""" + strArguments)
注意4个双引号引导路径,这部分很重要。用5个引号引导参数(/ C)不起作用,但尾随的5个可以分为4和1;并按此结构:

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

如果你打开cmd.exe只是发送一个命令,你只需要路径上的第一个引号(它不需要关闭)但VB需要尾随的那些"关闭&#34 ;引号出来。

祝你好运,伙计们。

答案 3 :(得分:1)

这项工作:

Dim current_path, current_rulename, cmd1 as STRING

current_path = "C:\this folder\file name.exe"    
current_rulename = "file name.exe"

cmd1 = "netsh advfirewall firewall add rule name = """ + current_rulename + """ dir = in action = block program = """ + current_path + """"
cmd1 &= " & "
cmd1 &= "netsh advfirewall firewall add rule name = """ + current_rulename + """ dir = out action = block program = """ + current_path + """"
cmd1 &= " & pause"

Process.Start("cmd", "/c " + cmd1)

基本上,带空格的变量需要这样封闭:

""" + string_with_spaces + """

分为几部分:

cmd1 = 
"
netsh advfirewall firewall add rule name = 
""" + current_rulename + """
dir=in action=block
program=
""" + current_path + """
"

此代码将两个单独的命令连接在一起,这些命令使用带空格的STRINGS。

答案 4 :(得分:0)

简单:

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

答案 5 :(得分:0)

这确实是一个古老的问题,但尚未解决。 我的贡献是2美分。

在字符串之前和之后使用 CHR(34),将其定界为:

Arg =“ Name =”&chr(34)&“ John Doe da Silva”&chr(34)

就这样!