我目前正在尝试从以编程方式创建的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"
想知道是否有人比我更了解这一点。
会有很大帮助。
提前谢谢!
答案 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尝试过,所以希望我能为你的场景正确调整它。