Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java代码运行批处理文件代码_Java_Batch File - Fatal编程技术网

从java代码运行批处理文件代码

从java代码运行批处理文件代码,java,batch-file,Java,Batch File,我想从java按钮单击执行批处理文件代码。另外,我不希望任何命令提示符窗口都显示在java代码中 我有一个代码:- C:\xyz-3.1.1\bin>dita --input=C:/Users/india/Desktop/mobile-phone/m obilePhone.xyz --format=pdf --output=C:/Users/india/Desktop --logfile=C:/Use rs/india/Desktop/dofhdif.txt 因此,我希望上面的代码从批处

我想从java按钮单击执行批处理文件代码。另外,我不希望任何命令提示符窗口都显示在java代码中

我有一个代码:-

C:\xyz-3.1.1\bin>dita --input=C:/Users/india/Desktop/mobile-phone/m
obilePhone.xyz --format=pdf --output=C:/Users/india/Desktop --logfile=C:/Use
rs/india/Desktop/dofhdif.txt
因此,我希望上面的代码从批处理命令运行,并将C:\xyz-3.1.1\bin>作为父目录

此外,每当我从JFileChooser中选择新文件时,我都想更新--input文件路径

我是通过按钮点击转换的java代码实现的:-

ProcessBuilder pb=new ProcessBuilder("dita --input=C:/Users/india/Desktop/mobile-phone/mobilePhone.xyz --format=pdf --output=C:/Users/india/Desktop --logfile=C:/Users/india/Desktop/dofhdif.txt");
pb.redirectErrorStream(true);
Process process=pb.start();
以及获取IOException错误

我在这里被困了很长时间,哪里出了问题

编辑:-错误

java.io.IOException: Cannot run program "dita --input=C:/Users/india/Desktop/mobile-phone/m
obilePhone.xyz --format=pdf --output=C:/Users/india/Desktop --logfile=C:/Use
rs/india/Desktop/dofhdif.txt": CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(Unknown Source)

正如前面提到的
错误
所述,它无法定位命令,因为整个字符串将被
ProcessBuilder
视为命令

尝试直接使用
Runtime.getRuntime().exec
,但必须确保可以找到命令
dita

Process process = Runtime.getRuntime().exec("C:\xyz-3.1.1\bin>dita --input=C:/Users/india/Desktop/mobile-phone/mobilePhone.xyz --format=pdf --output=C:/Users/india/Desktop --logfile=C:/Users/india/Desktop/dofhdif.txt");
process.waitFor();
int exitCode = process.exitValue();
System.out.println(IoHelper.output(process.getInputStream())); // handle the output;
在JDK 5.0之前,启动和执行进程的唯一方法是使用java.lang.Runtime类的exec()方法,之后可以使用ProcessBuilder帮助创建操作系统进程

主要的改进是,它还充当影响流程的所有属性的持有者。这就是它的使用方法:

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
另外,实际上
Runtime.getRuntime().exec也可以与
String…
一起使用,如下所示:

Runtime.getRuntime().exec(new String[]{"curl", "-v", "--cookie", tokenString, urlString});
我个人偏好:

  • 如果您必须为命令配置环境:要控制
    工作目录
    环境变量
    ,并且还要多次执行命令,最好使用它,因为
    ProcessBuilder
    将保存设置,您只需执行
    ProcessBuilder.start()
    创建另一个具有相同设置的流程

  • 如果您想执行前面提到的整个长字符串命令,最好使用
    Runtime.getRuntime().exec
    ,因为您可以直接执行它,而不必考虑参数格式


  • 正如前面提到的
    错误
    所述,它无法定位命令,因为整个字符串将被
    ProcessBuilder
    视为命令

    尝试直接使用
    Runtime.getRuntime().exec
    ,但必须确保可以找到命令
    dita

    Process process = Runtime.getRuntime().exec("C:\xyz-3.1.1\bin>dita --input=C:/Users/india/Desktop/mobile-phone/mobilePhone.xyz --format=pdf --output=C:/Users/india/Desktop --logfile=C:/Users/india/Desktop/dofhdif.txt");
    process.waitFor();
    int exitCode = process.exitValue();
    System.out.println(IoHelper.output(process.getInputStream())); // handle the output;
    
    在JDK 5.0之前,启动和执行进程的唯一方法是使用java.lang.Runtime类的exec()方法,之后可以使用ProcessBuilder帮助创建操作系统进程

    主要的改进是,它还充当影响流程的所有属性的持有者。这就是它的使用方法:

    ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
    
    另外,实际上
    Runtime.getRuntime().exec也可以与
    String…
    一起使用,如下所示:

    Runtime.getRuntime().exec(new String[]{"curl", "-v", "--cookie", tokenString, urlString});
    
    我个人偏好:

  • 如果您必须为命令配置环境:要控制
    工作目录
    环境变量
    ,并且还要多次执行命令,最好使用它,因为
    ProcessBuilder
    将保存设置,您只需执行
    ProcessBuilder.start()
    创建另一个具有相同设置的流程

  • 如果您想执行前面提到的整个长字符串命令,最好使用
    Runtime.getRuntime().exec
    ,因为您可以直接执行它,而不必考虑参数格式

  • 试试这个:

    String inputFile = ...;
    String outputFile = ...;
    String logFile = ...;
    
    ProcessBuilder pb = new ProcessBuilder(
            "dita",
            "--input=" + inputFile,
            "--format=pdf",
            "--output=" + outputFile,
            "--logfile=" + logFile)
        .directory(new File("C:\\xyz-3.1.1\\bin"))
        //.inheritIO();
        .redirectErrorStream(true);
    
    Process process = pb.start();
    
    这表明了以下几点:

  • 命令与参数分开
  • 参数值可以在运行时确定
  • 命令的默认目录(
    C:\xyz-3.1.1\bin
    )在启动进程之前设置
  • 如果希望进程的输出显示为Java应用程序输出的一部分,请考虑使用
    inheritaio()
    而不是
    redirectErrorStream()
  • 试试这个:

    String inputFile = ...;
    String outputFile = ...;
    String logFile = ...;
    
    ProcessBuilder pb = new ProcessBuilder(
            "dita",
            "--input=" + inputFile,
            "--format=pdf",
            "--output=" + outputFile,
            "--logfile=" + logFile)
        .directory(new File("C:\\xyz-3.1.1\\bin"))
        //.inheritIO();
        .redirectErrorStream(true);
    
    Process process = pb.start();
    
    这表明了以下几点:

  • 命令与参数分开
  • 参数值可以在运行时确定
  • 命令的默认目录(
    C:\xyz-3.1.1\bin
    )在启动进程之前设置
  • 如果希望进程的输出显示为Java应用程序输出的一部分,请考虑使用
    inheritaio()
    而不是
    redirectErrorStream()

  • 请发布异常的完整堆栈跟踪。“getting IOException error”-让我们知道您收到的错误(例如message、stacktrace等)会很有帮助@Azem我在中添加了异常EDIT@Thomas我在编辑中添加了,请仔细查看异常的完整堆栈跟踪。“getting IOException error”-让我们知道您收到的错误(例如消息、stacktrace等)会很有帮助@Azem我在中添加了异常EDIT@Thomas我在编辑中添加了,请看一看是的,这是正确的,我在命令上犯了一些错误。这就是我的问题,我如何编写命令,这样我就可以用java执行它,而不是分批单独执行。你的第一点是有意义的。由于我对批处理脚本不太了解,在我的例子中我将如何实现这一点。在您的命令中,
    dita
    到底是什么?脚本文件名?如果是,您可以直接使用
    exec
    直接执行它。如果没有,那么错误是什么?我必须在这个目录
    C:\xyz-3.1.1\bin>
    中才能执行命令。是的,这是正确的,我在命令上犯了一些错误。我的问题是如何编写命令,以便在