2017-10-16 1 views
0

Ich versuche, eine externe .bat auszuführen, indem Sie eine Taste drücken.Process.Start() funktioniert nur, wenn als Release-Build in VisualStudio gestartet

Die Absicht ist, einige XCOPY-Anweisungen aufzurufen. Daher führe ich "sync.bat" mit Process.Start (startInfo) aus.

Die Ausgabe dieser .bat wird zu meiner App umgeleitet und in einem Dialogfeld angezeigt. Mein Code wartet, bis der externe Anruf beendet ist.

echo "Batch SYNC started." 
pause 
xcopy "e:\a\*" "e:\b\" /f /i /c /e /y 
pause 
echo "Batch SYNC finished." 

OK: Wenn ich mein Programm als „Freigabe“ bauen und es innerhalb VisualStudio2013 beginnen, alles gut funktioniert (ich sehe die Ergebnisse, drücken muß, um in dem schwarzen Fenster eingeben, werden Dateien kopiert).

FAIL: Wenn ich meine App durch Doppelklick (in Datei-Explorer oder auf dem Desktop) oder ein Debug-Build in dem Visual Studio starten, sehe ich das ECHO und den PAUSE-Ausgang, aber der Ansatz tat nicht stopp und ich sehe keine Ergebnisse von XCOPY. Es scheint, als ob die PAUSE und XCOPY sofort getötet werden. Ich habe keine Ausnahme und keinen Eintrag im Windows-Protokoll.

Ich habe versucht, DEBUG und RELEASE Konfiguration identisch (ohne Erfolg) zu machen.

Hat jemand eine Idee, was ich tun kann, um diese einfache Funktion außerhalb der IDE zu arbeiten? Hier

ist der Code der Funktion aufgerufen wird, wenn die Taste gedrückt wird:

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

Wird Ihre Fledermausdatei in den entsprechenden Ausgabeordner kopiert? Ich vermute, dass Sie es nur in 'bin \ release' kopiert haben, so dass es nicht gefunden wird, wenn es von' bin \ debug' ausgeführt wird. – Filburt

+0

Haben Sie die Antwort hier überprüft: https://stackoverflow.com/questions/21731783/xcopy-or-move-do-not-work-when-a-wcf-service-runs-a-batch-file-why Sie Möglicherweise müssen die RedirectStandardOutput-Optionen entfernt werden – Bassie

Antwort

0

Lösung: Wenn ich zusätzlich

gesetzt
startInfo.RedirectStandardInput = true; 

dann funktioniert es. Ich kann die Eingabe vom Dialogfenster zum Prozess umleiten. Da ich keine Eingabe für die beabsichtigte XCOPY benötige, funktioniert diese Lösung für mich, ohne Zeichen aus dem Dialogfeld zu fangen und an den Prozess weiterzuleiten. Ich kann die Logik nicht sehen, warum ich Input umleiten muss, aber ich bin froh, dass meine Software jetzt tut, was ich brauche.

Verwandte Themen