Process.Start()仅在VisualStudio中作为发布版本启动时才有效

时间:2017-10-16 07:36:48

标签: c# batch-file visual-studio-2013 process

我正在尝试按下按钮执行外部.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========");
        }
}

1 个答案:

答案 0 :(得分:0)

<强>解决方案: 如果我另外设置

startInfo.RedirectStandardInput = true;

然后它的工作原理。我可以将对话框窗口中的输入重定向到Process。由于我不需要任何输入用于预期的XCOPY,因此该解决方案适用于我而不会从Dialog窗口中捕获字符并转发到该过程。 我无法看到逻辑,为什么我还要重定向输入,但我很高兴我的软件能够满足我的需求。