程序化创建CMD运行OpenVPN时引号失效问题排查
解决程序化启动CMD运行OpenVPN时的引号问题
嘿,我懂你现在卡在哪了——用C#写代码通过CMD启动OpenVPN,结果路径里的空格加上引号,CMD总是解析不对对吧?别着急,咱们来搞定这个问题。
首先说个最省心的方案:直接启动OpenVPN.exe,绕开CMD。其实完全没必要通过CMD中转,直接调用OpenVPN的可执行文件,把配置文件作为参数传进去就行,这样根本不会碰到CMD的引号解析坑:
private void btnRunVpn_Click(object sender, EventArgs e) { // 注意这里路径不用额外加引号,ProcessStartInfo会自动处理带空格的路径 string openVpnPath = @"C:\Program Files\OpenVPN\bin\openvpn.exe"; string configPath = @"C:\Users\Jeremy\Desktop\OpenSource Rat\easyRDPClient\TutClient\bin\Debug\NewServerClient.ovpn"; var startInfo = new ProcessStartInfo(openVpnPath) { // 把配置参数传进去,这里用双引号括住配置路径,避免空格问题 Arguments = $"--config \"{configPath}\"", // 如果需要显示OpenVPN的窗口,设置这个属性 WindowStyle = ProcessWindowStyle.Normal }; Process.Start(startInfo); }
要是你确实必须通过CMD来启动(比如需要保留CMD窗口看输出),那得正确处理CMD的引号转义规则。CMD里要传递带引号的参数时,需要把整个命令用引号括起来,同时命令内部的引号要写成两个双引号来转义:
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"; // 构建CMD的参数:/K 后面的命令要整体用引号括住,内部的引号用两个双引号转义 string cmdArguments = $"/K \"\"{openVpnDir}\" --config \"{myDir}\"\""; Process.Start("CMD.exe", cmdArguments); }
简单解释下:CMD在解析参数时,会把连续的两个双引号当成一个实际的双引号来处理,这样就能正确识别带空格的路径了。
个人强烈推荐第一种方案,不仅代码更简洁,还能避免CMD带来的各种解析问题,效率也更高。如果需要查看OpenVPN的输出,还可以通过ProcessStartInfo的RedirectStandardOutput等属性来捕获输出,比盯着CMD窗口更灵活。
内容的提问来源于stack exchange,提问作者Jeremy Griffin
相关产品推荐
相关产品推荐

