2013-05-09 146 views
0

我正在开发一个源代码判断软件。我在Linux平台上开发了UBuntu 12.04 LTS。替代windows的unix shell命令?

现在我想在Windows上部署它。 我的软件,我正在创建命令按照UNIX shell,将它们保存在一个文件,然后通过文件执行命令。 下面是代码的一部分:

package codejudge.compiler.languages; 

import java.io.BufferedWriter; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 

import codejudge.compiler.TimedShell; 

public class C extends Language { 

    String file, contents, dir; 
    int timeout; 

    public C(String file, int timeout, String contents, String dir) { 
     this.file = file; 
     this.timeout = timeout; 
     this.contents = contents; 
     this.dir = dir; 
    } 
    public void compile() { 
     try { 
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dir + "/" + file))); 
      out.write(contents); 
      out.close(); 
      // create the compiler script 
      out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dir + "/compile.sh"))); 
      out.write("cd \"" + dir +"\"\n"); 
      out.write("gcc -lm " + file + " 2> err.txt"); 
      out.close(); 
      Runtime r = Runtime.getRuntime(); 
      Process p = r.exec(dir + "/compile.sh"); 
      p.waitFor(); 
      p = r.exec(dir + "/compile.sh"); // execute the compiler script 
      TimedShell shell = new TimedShell(this, p, timeout); 
      shell.start(); 
      p.waitFor(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void execute() { 
     try { 
      // create the execution script 
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dir + "/run.sh"))); 
      out.write("cd \"" + dir +"\"\n"); 

      out.write("./a.out <in.txt> out.txt"); 
      out.close(); 
      Runtime r = Runtime.getRuntime(); 
      Process p = r.exec(dir + "/run.sh"); 
      p.waitFor(); 
      p = r.exec(dir + "/run.sh"); // execute the script 
      TimedShell shell = new TimedShell(this, p, 3000); 
      shell.start(); 
      p.waitFor();    
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

当我在窗户我收到以下错误回报(IHAVE安装在Windows上的MinGW)上运行相同的代码:

Codejudge compilation server running ... 
Compiling garima.c... 
java.io.IOException: Cannot run program "C:\xampp\htdocs\project\codejudge-compiler\stage\1/compile.sh": CreateProcess error=193, %1 is not a valid Win32 application 
    at java.lang.ProcessBuilder.start(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at codejudge.compiler.languages.C.compile(C.java:41) 
    at codejudge.compiler.RequestThread.run(RequestThread.java:65) 
Caused by: java.io.IOException: CreateProcess error=193, %1 is not a valid Win32 application 
    at java.lang.ProcessImpl.create(Native Method) 
    at java.lang.ProcessImpl.<init>(Unknown Source) 
    at java.lang.ProcessImpl.start(Unknown Source) 
    ... 6 more 
java.io.FileNotFoundException: C:\xampp\htdocs\project\codejudge-compiler\stage\1\err.txt (The system cannot find the file specified) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at codejudge.compiler.RequestThread.compileErrors(RequestThread.java:90) 
    at codejudge.compiler.RequestThread.run(RequestThread.java:66) 
java.io.IOException: Cannot run program "C:\xampp\htdocs\project\codejudge-compiler\stage\1/run.sh": CreateProcess error=193, %1 is not a valid Win32 application 
    at java.lang.ProcessBuilder.start(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at codejudge.compiler.languages.C.execute(C.java:65) 
    at codejudge.compiler.RequestThread.run(RequestThread.java:72) 
Caused by: java.io.IOException: CreateProcess error=193, %1 is not a valid Win32 application 
    at java.lang.ProcessImpl.create(Native Method) 
    at java.lang.ProcessImpl.<init>(Unknown Source) 
    at java.lang.ProcessImpl.start(Unknown Source) 
    ... 6 more 
java.io.FileNotFoundException: C:\xampp\htdocs\project\codejudge-compiler\stage\1\out.txt (The system cannot find the file specified) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at codejudge.compiler.RequestThread.execMsg(RequestThread.java:106) 
    at codejudge.compiler.RequestThread.run(RequestThread.java:77) 

我很少有关win32 shell命令的知识。需要对代码进行哪些更改即ie。哪些命令应该更改,哪些不能在Windows上运行?他们的窗户替代物是什么?

+0

正在使用cygwin一个选项吗? – piokuc 2013-05-09 17:52:58

+0

真的没用过吗?即使我使用它,我将如何将请求重定向到cygwin? – shiven 2013-05-09 17:54:04

+0

你需要在cygwin shell中运行整个事情 – piokuc 2013-05-09 17:54:38

回答

0

安装Cygwin时,请确保包含所有与Java编译器相关的东西。在安装Cygwin终端后会出现在桌面上,打开该终端。在这个终端上,你可以运行带有bin,sbin,usr等目录的完全虚拟化的Linux环境几乎所有的Linux命令。而且,在cygdrive下你会得到windows驱动器。所以,试试吧!