我有一个运行.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
)发送数据。
当进程运行时,所有信息都显示在进程窗口中,例如可能会发生错误,文件未被传输,并且在此&#34; child&#34;中显示了详细说明此消息的消息。过程窗口。一旦这个过程结束了孩子&#34;窗口随着消息一起消失。
我可以以某种方式将这些有用的信息返回到我的主控制台应用程序窗口吗?
答案 0 :(得分:3)
检查流程退出代码(Process.ExitCode
)和/或捕获控制台输出。
请参阅Capturing console output from a .NET application (C#)
虽然你最好使用一些原生的.NET SFTP / FTP库。
对于SFTP,请参阅SFTP Libraries for .NET
对于FTP和FTPS,使用可以使用.NET框架中的FtpWebRequest
。
如果你想要一体化解决方案,我可以谦卑地建议你我的 WinSCP .NET assembly。使用程序集,您可以使用相同的SFTP,FTP和FTPS代码。在内部,程序集实际上运行WinSCP控制台应用程序。所以它正在尝试自己编写代码。
答案 1 :(得分:3)
如果将this.aProcess.StartInfo.UseShellExecute
设置为false
,则子进程应使用现有的控制台窗口。
对于批处理文件,此更改还意味着您需要显式调用cmd /c
来运行它们,这与您当前正在调用cscript /B
以运行.vbs脚本的方式完全相同。