2017-10-16 1 views
0

ボタンを押して外部の.batを実行しようとしています。Process.Start()はVisualStudio内のリリースビルドとして起動したときにのみ動作します

意図するいくつかの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." 

OK:私は「リリース」として私のプログラムを構築し、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

あなたのbatファイルはそれぞれの出力フォルダにコピーされていますか?私は 'bin \ release'にコピーして、' bin \ debug'から実行しても見つからないと思うでしょう。 – Filburt

+0

ここでその答えを確認しましたか:https://stackoverflow.com/questions/21731783/xcopy-or-move-do-not-work-when-a-wcf-service-runs-a-batch-file-why 'RedirectStandardOutput'オプションを削除する必要があるかもしれません – Bassie

答えて

0

ソリューション: 私はさらに

startInfo.RedirectStandardInput = true; 

を設定した場合、それは動作します。ダイアログウィンドウから入力をプロセスにリダイレクトすることができます。私は意図したXCOPYの入力を必要としないので、このソリューションはDialogウィンドウから文字をキャッチせずに処理に進むことができます。 私はロジックを見ることができません、なぜ私はリダイレクトする必要もありますが、私のソフトウェアが今私が必要としていることをうれしく思います。

関連する問題