使用args自动执行程序

vshtjzan  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(399)

我正在构建一个工具,它应该通过windows命令提示符从格式a转换为格式b。我设计了一个互动模式。cmd等待输入命令并处理它们。现在我想通过一些参数,如果我调用程序。参数将被传递,但程序不会自己执行命令。
我传递的参数如下: 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
}

不同的 setter 在main方法中,您只需将传递的信息设置为在类的顶部声明的变量。然后这些变量应该传递给 ConverterControl 它的整个转换程序 link() 方法。如果在执行 startCMD() 命令。
有人知道如何调用这些方法并启动 ConverterControl 自动地?

ws51t4hk

ws51t4hk1#

你很可能被困在while循环的末尾 startCmd() ,你的程序就再也不会继续了。

vngu2lb8

vngu2lb82#

如果收到命令行参数,为什么要调用startcmd()?
另一方面,看起来您也可能有点误用了静态变量。
为了进一步整理,您的“testing”类应该实现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);
        }

相关问题