替换windows的unix shell命令?

时间:2013-05-09 17:50:07

标签: java linux shell

我正在开发一个源代码判断软件。我是在UBuntu 12.04 LTS的Linux平台上开发的。

现在我想在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();
        }
    }
}

当我在Windows上运行相同的代码时,我得到以下错误(我在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命令知之甚少。需要对代码进行哪些更改,即。应该更改哪些命令不能在Windows上运行?他们对windows的替代品是什么?

2 个答案:

答案 0 :(得分:0)

您可以使用gnuwin32执行大多数任务。

答案 1 :(得分:0)

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