Java から呼び出して終了値をチェックする必要がある単純なルーチンを .Net で作成しました。何らかの理由で Java から呼び出すと、waitFor が終了しません。これは、コマンド プロンプトから呼び出されると .Net ルーチンがすぐに終了し、test.bat から呼び出されると正しく -1 を返すという事実にもかかわらずです。問題が何であるか誰にも分かりますか?
Java コードは次のとおりです。
public static int runOnceWait(String[] cmdarray) throws IOException, InterruptedException
{
Process p;
p = Runtime.getRuntime().exec(cmdarray);
int res = p.waitFor();
p.destroy();
return res;
}
/**
* @param args
* @throws InterruptedException
* @throws IOException
*/
public static void main(String[] args) throws IOException, InterruptedException
{
String [] cmd = new String[2];
cmd[0]=signer;
cmd[1]=fileLocation;
System.out.println ("\"" + cmd[0] + "\" \"" + cmd[1] + "\"");
System.out.println (runOnceWait(cmd));
}
C# コードは次のとおりです。
static int Main(string[] args)
{
if (args.Length != 1 && args.Length != 2)
{
Console.WriteLine("Use: ");
Console.WriteLine("DocumentSigner.exe source");
Console.WriteLine(" or");
Console.WriteLine("DocumentSigner.exe source, destination");
return -100;
}
string destination = null;
try
{
if (args.Length == 1) destination = Sign(args[0]);
else destination = Sign(args[0], args[1]);
Console.WriteLine("Document signed and saved as " + destination);
}
catch (Exception e)
{
Console.WriteLine(e);
return -1;
}
return 0;
}
テスト目的で、期待どおりに動作する .bat ファイルを作成しました。つまり、-1 の ERRORLEVEL を返します。
.bat ファイルは次のとおりです。
@echo off
rem test.bat
"DocumentSigner.exe" "{5E3C1967-A26E-4FC5-A6A8-3F358F388A3D}.pdf"
@if "%ERRORLEVEL%" == "0" goto good
:fail
echo Execution Failed
echo return value = %ERRORLEVEL%
goto end
:good
echo Execution succeeded
echo Return value = %ERRORLEVEL%
goto end
:end