【问题标题】:C# Interacting with CLI Process - StandardInput Stops ExecutingC# 与 CLI 进程交互 - StandardInput 停止执行
【发布时间】: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


【解决方案1】:

process.StartInfo.FileName = @"C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpncli.exe"; process.StartInfo.Arguments = "connect vpn.service.domain.com -s"; ... process.StandardInput.WriteLine(userDetails.UserName); process.StandardInput.WriteLine(userDetails.Password);

我添加了 -s,它对我有用(这会将标准输入扩展到控制台)。

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多