2

ここのコードを使用して、ac# コンソール アプリケーションから .bat ファイルを実行しようとしています: バッチ ファイルを呼び出した後、WaitForExit でサービスがハングアップします

ケビンのソリューションはちょっと機能しますが、.bat ファイルの一部のコマンドは何らかの理由で無視されますが、.bat ファイルを手動で実行すると、すべてのコマンドが正常に機能します。

たとえば、コンソール アプリから .bat を実行している間は xcopy コマンドは機能しませんが、start コマンドは正常に機能します。

なぜこれが起こるのか分かりますか?

ps最近、プログラムがコマンドプロンプトから起動されている場合、うまく機能することがわかりました。どうして?それでも自動実行する必要があるため、これでは問題は解決しません。

また、exeファイルをクリックして起動すると、出力が表示されます

xcopy フォルダー1 フォルダー2

ただし、コマンドプロンプトから起動した場合、出力は次のように表示されます

xcopy フォルダー1 フォルダー2

smth/smth.smth がコピーされました

....

5 個のファイルがコピーされました。

そして、それは実際にコピーされています。

proc.StartInfo.FileName                 = target;
        proc.StartInfo.RedirectStandardError    = true;
        proc.StartInfo.RedirectStandardOutput   = true;
        proc.StartInfo.UseShellExecute          = false;

        proc.Start();

        proc.WaitForExit
            (
                (timeout <= 0)
                ? int.MaxValue : timeout * NO_MILLISECONDS_IN_A_SECOND *
                   NO_SECONDS_IN_A_MINUTE
            );

        errorMessage    = proc.StandardError.ReadToEnd();
        proc.WaitForExit();

        outputMessage   = proc.StandardOutput.ReadToEnd();
        proc.WaitForExit();
4

1 に答える 1

2

サービスからコマンド プロセッサを実行する場合、バッチ ファイル コマンドは無視されません。ただし、それらは簡単に失敗し、出力が表示されないため、観察されない可能性があります。失敗の一般的な理由は、ProcessStartInfo.WorkingDirectory が正しく設定されていないために相対パスが機能しなくなったり、デスクトップから使用するものと同じ権限を持たない別のユーザー アカウントで実行されているサービスが原因で問題が発生したりすることです。

出力をファイルにリダイレクトして問題を診断し、cmd.exe /c を実行して>演算子を使用します。2>&1ファイルに通常の出力とエラー出力の両方が含まれるように追加します。また、%errorlevel% 変数EXIT コマンドを慎重に使用することで、Process.ExitCode プロパティを使用して実行が失敗したことを発見できます。

于 2012-05-13T13:51:50.700 に答える