【发布时间】:2017-01-25 14:16:04
【问题描述】:
我正在尝试使用 C# StandardInputs 和 StandardOutputs 与 CLI 交互。
我在 process.StandardInput.WriteLine() 之前和之后以及 StandardOutput 循环之后插入了断点。
当我进入 process.StandardInput.WriteLine() 时,代码立即停止执行,焦点返回到我的主窗体 (winform)。 process.StandardInput.WriteLine() 之后的断点(或任何其他代码)永远不会执行。
在循环中调用最后一个 process.StandardOutput.WriteLine() 时也会发生同样的事情
Process process = new Process();
process.StartInfo.FileName = @"C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpncli.exe";
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.StandardInput.AutoFlush = true;
process.StandardInput.WriteLine("connect vpn.service.domain.com");
...Additional code below
如果我在 aprocess.StandardInput.WriteLine() 之前使用此循环读取 StandardOutput,也会发生同样的事情:
string line = string.Empty;
while ((line = process.StandardOutput.ReadLine()) != null)
{
Console.WriteLine("CLI Says: " + line);
}
...Additional code below
我还注意到,如果我使用普通的 GUI 命令提示符运行 Cisco VPN CLI,我会得到以下输出:
Copyright (c) 2004 - 2015 Cisco Systems, Inc. All Rights Reserved.
>> state: Disconnected
>> state: Disconnected
>> notice: Ready to connect.
>> registered with local VPN subsystem.
VPN>
但是当我运行 process.StandardOutput.ReadLine() Loops 时,我得到了这个输出。您可以看到所有额外的空白行和额外的“VPN>”提示:
Cisco AnyConnect Secure Mobility Client (version 3.1.10010) .
Copyright (c) 2004 - 2015 Cisco Systems, Inc. All Rights Reserved.
>> state: Disconnected
VPN>
>> state: Disconnected
VPN>
>> notice: Ready to connect.
VPN>
>> registered with local VPN subsystem.
【问题讨论】:
-
我不信任 AutoFlush。尝试使用 process.StandardInput.Flush()。 AutoFlush 使用的计时器可能会在您调试时停止。
-
有趣,解决了 process.StandardInput.WriteLine(); 的问题但它没有解决 process.StandardOutput.ReadLine() 循环的问题。这绝对不是循环本身的问题,因为如果我只是列出一堆 process.StandardOuput.ReadLine()s 而不是循环它仍然会在它到达最后一个之后停止执行代码。
-
您永远不想在不是文件的流上测试空值。您正在读取流中的所有数据并获取设置空条件的 EOF,因此您永远不会进入 while 循环。
-
基本上你想连接到VPN,我说的对吗?如果您有 Cisco 的
vpnclient.exe,您可以更轻松地实现您的需求 -
@jdweng 循环实际上工作正常。它循环直到它试图读取最后一行。就像我说的,如果我删除循环,就像输出 25 行 Console.WriteLine(process.StandardOutput.ReadLine());它将通过其中的 24 个,但在最后一个代码中断。
标签: c# asp.net .net command-line command-line-interface