【问题标题】:Batch process to pass information back to console application window将信息传回控制台应用程序窗口的批处理
【发布时间】:2015-06-17 10:43:55
【问题描述】:

我有一个运行.bat 和.vbs 文件的控制台应用程序。

启动这些进程的方法如下:

public void runProcess(string aPath,string aName,string aFiletype)
{
  string stInfoFileName;
  string stInfoArgs;

  if(aFiletype == "bat")
  {
    stInfoFileName = (@aPath + @aName);
    stInfoArgs = string.Empty;
  }
  else
  { //vbs
    stInfoFileName = @"cscript";
    stInfoArgs = "//B //Nologo " + aName;
  }

  this.aProcess.StartInfo.FileName = stInfoFileName;
  this.aProcess.StartInfo.Arguments =  stInfoArgs;
  this.aProcess.StartInfo.WorkingDirectory = @aPath;

  this.aProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
  this.aProcess.Start();

  Console.WriteLine("information passed from batch: ???");

  this.aProcess.WaitForExit(); //<-- Optional if you want program running until your script exit
  this.aProcess.Close();
}

它正在启动的当前.bat 文件用于通过ftp(ftp、ftps 或sftp)发送数据。

当进程运行时,所有信息都会显示在进程窗口中,例如可能会发生错误,文件未传输,并且此“子”进程窗口中会显示一条详细说明此问题的消息。进程完成后,“子”窗口会与消息一起消失。

我能否以某种方式将这些有用信息返回到我的主控制台应用程序窗口?

【问题讨论】:

    标签: c# windows batch-file ftp ftps


    【解决方案1】:

    检查进程退出代码 (Process.ExitCode) 和/或捕获控制台输出。

    见Capturing console output from a .NET application (C#)


    虽然你最好使用一些原生的 .NET SFTP/FTP 库。

    对于 SFTP,请参阅SFTP Libraries for .NET

    对于 FTP 和 FTPS,可以使用 .NET 框架中的FtpWebRequest。


    如果您想要多合一解决方案,我可以谦虚地建议您 my WinSCP .NET assembly。使用该程序集,您可以为 SFTP、FTP 和 FTPS 使用相同的代码。在内部,程序集实际上运行 WinSCP 控制台应用程序。因此,它正在做与您尝试自己编写代码相同的事情。

    【讨论】:

    • 感谢 Martin - 非常奇怪的巧合,您确实应该回答 - 我们刚刚开始使用您的(+ 贡献者)应用程序进行一些 sftp。我们使用的客户端被证明是相当“脆弱”的。
    • 我相对缺乏使用 c# 和 ftp 技术的经验 - 似乎您的程序集可以通过摆脱批处理文件等来简化我们的流程 - 但是,对于 c# 经验有限的人来说,您的程序集有多复杂使用?
    • 在 VS 中点击几下安装NuGet package,然后只需几行代码,see example。
    • 我会试一试先生 - 尝试没有坏处!
    【解决方案2】:

    如果您将this.aProcess.StartInfo.UseShellExecute 设置为false,则子进程应使用现有的控制台窗口。

    对于批处理文件,此更改还意味着您需要显式调用 cmd /c 来运行它们,这与您当前调用 cscript /B 来运行 .vbs 脚本的方式完全相同。

    【讨论】:

    • 我需要修改这行代码吗? stInfoArgs = string.Empty;
    • 我还需要修改这行代码吗? stInfoFileName = (@aPath + @aName);目前只是一条完整的路径
    • 我添加了一个后续问题,与我实施您的建议的悲伤尝试有关:stackoverflow.com/questions/30914435/…
    • - 我不需要更改任何内容,即您明确调用 cmd /c 的建议在我的上下文中是不正确的。我的最终代码在这里详述:stackoverflow.com/questions/30914435/…
    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多