为什么我的引用标记不能在CMD内部工作

时间:2018-04-25 15:16:59

标签: c#

我目前正在尝试从以编程方式创建的CMD运行openVPN。

以下是我创建的代码:

private void btnRunVpn_Click(object sender, EventArgs e)
    {
        string openVpnDir = @"""C:\Program Files\OpenVPN\bin\openvpn.exe""";
        string myDir = @"""C:\Users\Jeremy\Desktop\OpenSource Rat\easyRDPClient\TutClient\bin\Debug\NewServerClient.ovpn""";
        string configCommand = " --config ";
        string command = openVpnDir + configCommand + myDir;
        System.Diagnostics.Process.Start("CMD.exe", "/K " + command);

        MessageBox.Show(command);

    }

消息框显示正确的命令:

"C:\Program Files\OpenVPN\bin\openvpn.exe" --config "C:\Users\Jeremy\Desktop\OpenSource Rat\easyRDPClient\TutClient\bin\Debug\NewServerClient.ovpn"

但是命令提示符正在返回:

'C:\Program' is not recognized as an internal or external command, operable program or batch file. 

该命令是完全正确的,因为显示命令的消息框是正确的,当我将消息框中的内容复制到命令提示符中时,它也能正常工作。

想知道是否与创建的两个字符串有关,这两个字符串都有@“”“message”“”来正确显示消息。想知道这是不是问题。

我似乎无法正确地删除双引号,因为它是一个目录。所以我被迫使用@“”“test”“”来显示像"test"

这样的命令

想知道是否有人比我更了解这一点。

会有很大帮助。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

我相信这会做你希望完成的事情。它应该保持命令行打开,并纠正删除引号的问题。

在下面的示例中,我在“开始”命令中的命令变量周围添加了引号。

private void btnRunVpn_Click(object sender, EventArgs e)
{
    string openVpnDir = @"""C:\Program Files\OpenVPN\bin\openvpn.exe""";
    string myDir = @"""C:\Users\Jeremy\Desktop\OpenSource Rat\easyRDPClient\TutClient\bin\Debug\NewServerClient.ovpn""";
    string configCommand = " --config ";
    string command = openVpnDir + configCommand + myDir;
    System.Diagnostics.Process.Start("CMD.exe", "/K " + "\"" + command + "\"");

    MessageBox.Show(command);

}

我认为发生的事情是CMD / K期待1个论点。由于您传递了多个,因此只查看第一个(并在删除引号时)。这留下了:

C:\Program Files\OpenVPN\bin\openvpn.exe

由于路径中的空间,它无法找到应用程序。

通过将整个命令包装在引号中,它会强制CMD将其视为单个参数。然后删除外部引号并处理所需的命令。

我在VB.NET中用Notepad尝试过,所以希望我能为你的场景正确调整它。