用args自动执行程序

时间:2015-01-15 14:44:54

标签: java cmd args

我正在构建一个工具,它应该通过Windows命令提示符从格式A转换为格式B.我编写了类似于交互模式的东西。 cmd等待输入命令并处理它们。 现在,如果我打电话给程序,我想通过一些args。 args将被传递,但程序不会自己执行命令。

我正在传递这样的args:

java -jar test.jar -interactive //activates the interactive mode, which does not make any problems

并且像这样(传递源文件,保存转换文件的目标位置,目标格式以及转换期间使用的配置文件):

java -jar test.jar C:\Users\User\Desktop\test.json C:\Users\User\Desktop .xes C:\Users\User\Desktop\test.properties

到目前为止

代码:

public static void main(final String[] args) throws IOException, InterruptedException {

    if (args[0].equals("-interactive")) {
        testing test = new testing();
        test.startCMD();
    } else if (args[0] != null && args[1] != null && args[2] != null && args[3] != null) {
        final testing test = new testing();
        test.startCMD();
        //the following construct doesn't work unfortunatelly
        worker = Executors.newSingleThreadScheduledExecutor();
        Runnable task = new Runnable() {

            @Override
            public void run() {
                    test.setSourceFile(args[0]);
                    test.setTargetPath(args[1]);
                    test.setTargetFormat(args[2]);
                    test.setConfigFilePath(args[3]);
                    System.out.println("Invoking the conversion routine now ...");
                    ConverterControl control = new ConverterControl();
                    control.link(sourceFilePath, targetPath, configFilePath, targetFormat, fileConfig);
            }

        };
        worker.schedule(task, 5, TimeUnit.SECONDS);
    }
}

public void startCMD() throws IOException, InterruptedException {
    String[] command
            = {
                "cmd",};
    Process p = Runtime.getRuntime().exec(command);
    new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
    new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
    BufferedReader in = new BufferedReader(
            new InputStreamReader(System.in));
    System.out.println("Welcome to the Windows command line prompt." + System.lineSeparator());
    System.out.println("Please type \"help\" to receive a list of commands available in this environment.");
    //String s = in.readLine();
    String input;
    while ((input = in.readLine()) != null) {
        //process the inputs
}

您在main方法中看到的不同setter只是将传递的信息设置为在类顶部声明的变量。然后,这些变量应传递给ConverterControllink()在其startCMD()方法中具有整个转换例程。 如果我在执行ConverterControl命令后传递4个参数(参见顶部程序的第二次调用),程序将停止。

有谁知道如何调用这些方法并自动启动{{1}}?

2 个答案:

答案 0 :(得分:1)

您可能会在startCmd()结尾处停留在while循环中,并且您的程序永远不会继续。

答案 1 :(得分:0)

如果收到命令行参数,为什么要调用startCMD()?

顺便说一下,看起来你可能也会误用静态变量。

为了整理这一点,你的'测试'类应该实现Runnable,你应该将你的'test'对象的引用传递给你的worker。

if (args[0].equals("-interactive")) {
    testing test = new testing();
    test.startCMD();
} else if (args[0] != null && args[1] != null && args[2] != null && args[3] != null) {
                final testing test = new testing();
        test.startCMD();//Why is this call here?

        test.setSourceFile(args[0]);
        test.setTargetPath(args[1]);
        test.setTargetFormat(args[2]);
        test.setConfigFilePath(args[3]);

        worker = Executors.newSingleThreadScheduledExecutor();
        worker.schedule(test, 5, TimeUnit.SECONDS);
}

run()方法的其余部分将简单地移出到'testing'类中的run()方法中。

@Override
        public void run() {
                ConverterControl control = new ConverterControl();
                control.link(sourceFilePath, targetPath, configFilePath, targetFormat, fileConfig);
        }