1

これは私が達成しようとしていることです: JAVA プログラムからバッチ ファイルを実行します。バッチは、特定のフォルダー (フォルダー 'A' としましょう) に新しいファイルを作成します。新しいファイルが作成されると、JAVA プログラムは新しく作成されたファイルをフォルダー 'A' からフォルダー 'B' に移動します。

以下はコード スニペットです。

// Run a batch that creates a file
String[] cmd = new String[]{"cmd", "/C", "start /min" + batchFilePath + batchFileName};
Process proc = Runtime.getRuntime().exec(cmd);  
proc.waitFor();


// Command in the batch file

dir c:\ > C:\Chen_Med\EDICron\EDIOUT\test.edi
exit

// Move the file created by batch
boolean result2= ediOutFile.renameTo(new File(processedFolder, ediOutFile.getName()));

上記のコードを実行すると、次のようになります。新しいファイルがフォルダー 'A' に作成されます。ただし、新しく作成されたファイルはフォルダー 'B' に移動されません。

分析:

上記のコードには構文上の問題はありません。ファイルを移動する代わりの方法を試しました。つまり、フォルダ「A」からフォルダ「B」にファイルを読み書きしてから、フォルダ「A」からファイルを削除します。フォルダ「B」に新しいファイルが作成されますが、ファイルはフォルダ「B」から削除されません。ファイルを移動しようとする別のプログラムを実行すると、上記のプログラムが実行された後、動作します。つまり、Runtime がファイルを制御しているという問題があるようです。

解決策を教えてください。私は解決策を見つけようとして一日を無駄にしました:(

4

1 に答える 1

3

を使用cmd /c start ...してバッチファイルを開始すると、非同期で開始します。つまり、cmd.exeバッチファイルを実行する2番目のプロセスを作成し、proc.waitFor()元のプロセスを待機しcmd.exeますが、バッチファイル自体は待機しません。その後、バッチファイルはJavaプログラムと並行して実行され、ファイルが作成される前に、Javaからファイルの名前を変更しようとします。

代わりに、を使用するだけcmd /c batch.batで、これで問題なく動作するはずです。

于 2012-05-04T14:09:47.457 に答える