我正在尝试按下按钮执行外部.bat。
目的是调用一些XCOPY指令。因此,我使用Process.Start(startInfo)执行“sync.bat”。
该.bat的输出被重定向到我的应用程序并显示在对话框中。我的代码等待外部调用完成。
echo "Batch SYNC started."
pause
xcopy "e:\a\*" "e:\b\" /f /i /c /e /y
pause
echo "Batch SYNC finished."
确定: 当我将程序构建为“发布”并在VisualStudio2013中启动时,一切正常(我看到结果,必须在黑色窗口中按ENTER,文件被复制)。
FAIL: 当我通过双击(在文件浏览器或桌面上)或VisualStudio中的调试版本启动我的应用程序时,我看到ECHO和PAUSE输出,但批处理没有停止,我看不到XCOPY的结果。似乎PAUSE和XCOPY被立即杀死了。 我没有例外,也没有在Windows日志中输入。
我试图使DEBUG和RELEASE配置相同(没有成功)。
是否有人知道我可以做些什么来让这个简单的功能在IDE之外工作?
以下是按下按钮时调用的函数的代码:
private void ProcessSync_bat()
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.FileName = "sync.bat";
startInfo.WindowStyle = ProcessWindowStyle.Normal;
startInfo.Arguments = "";
startInfo.ErrorDialog = true;
try
{
// Start the process with the info we specified.
// Call WaitForExit and then the using statement will close.
using (Process exeProcess = Process.Start(startInfo))
{
dlgFKSyncMessageBox.AddLine("----------sync.bat started-----------");
dlgSyncMessageBox.AddLine("===============Result================");
while (!exeProcess.StandardOutput.EndOfStream)
{
dlgSyncMessageBox.AddLine(exeProcess.StandardOutput.ReadLine());
}
dlgSyncMessageBox.AddLine("===============ERRORS================");
while (!exeProcess.StandardError.EndOfStream)
{
dlgSyncMessageBox.AddLine(exeProcess.StandardError.ReadLine());
}
exeProcess.WaitForExit();
}
}
catch (Exception exp)
{
dlgSyncMessageBox.AddLine("========EXCEPTION========");
}
}
答案 0 :(得分:0)
<强>解决方案:强> 如果我另外设置
startInfo.RedirectStandardInput = true;
然后它的工作原理。我可以将对话框窗口中的输入重定向到Process。由于我不需要任何输入用于预期的XCOPY,因此该解决方案适用于我而不会从Dialog窗口中捕获字符并转发到该过程。 我无法看到逻辑,为什么我还要重定向输入,但我很高兴我的软件能够满足我的需求。