通过Java运行cmd命令

通过Java运行cmd命令,java,cmd,cd,Java,Cmd,Cd,我找到了几个通过Java类运行cmd命令的代码片段,但我无法理解 这是打开命令的代码 public void excCommand(String new_dir){ Runtime rt = Runtime.getRuntime(); try { rt.exec(new String[]{"cmd.exe","/c","start"}); } catch (IOException e) { // TODO Auto-generated c

我找到了几个通过Java类运行cmd命令的代码片段,但我无法理解

这是打开命令的代码

public void excCommand(String new_dir){
    Runtime rt = Runtime.getRuntime();
    try {
        rt.exec(new String[]{"cmd.exe","/c","start"});

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
我还找到了一些用于添加其他命令(如cd)的链接

有谁能帮助我了解如何刻录目录,例如:

 cd C:\Program Files\Flowella

然后在该目录上运行其他命令?

最简单的方法是使用

例如,要获取Windows上默认浏览器的注册表值,请执行以下操作:

String command = "REG QUERY HKEY_CLASSES_ROOT\\http\\shell\\open\\command";
try
{
    Process process = Runtime.getRuntime().exec(command);
} catch (IOException e)
{
    e.printStackTrace();
}
然后使用
扫描仪
获取命令的输出(如有必要)

Scanner kb = new Scanner(process.getInputStream());
注意
\
字符串
中的转义字符,必须转义才能正常工作(因此
\


但是,没有名为
cd
的可执行文件,因为它不能在单独的进程中实现

当前工作目录起作用的一种情况是执行外部进程(使用或)。在这些情况下,您可以显式指定用于新启动的进程的工作目录

命令的最简单方式:

System.setProperty("user.dir", "C:\\Program Files\\Flowella");
您可以尝试以下方法:-

Process p = Runtime.getRuntime().exec(command);

一旦获得了对Process的引用,就可以对其调用getOutpuStream以获取cmd提示符的标准输入。然后,您可以使用write方法在流上发送任何命令,就像在任何其他流上一样

请注意,它是process.getOutputStream(),它连接到生成的进程上的stdin。类似地,要获得任何命令的输出,您需要调用getInputStream,然后将其作为任何其他输入流进行读取。

我的示例(来自real project)

文件夹-文件

zipFile,filestring-String

        final String command = "/bin/tar -xvf " + zipFile + " " + filesString;
        logger.info("Start unzipping: {}    into the folder {}", command, folder.getPath());
        final Runtime r = Runtime.getRuntime();
        final Process p = r.exec(command, null, folder);
        final int returnCode = p.waitFor();

        if (logger.isWarnEnabled()) {
            final BufferedReader is = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while ((line = is.readLine()) != null) {
                logger.warn(line);
            }
            final BufferedReader is2 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            while ((line = is2.readLine()) != null) {
                logger.warn(line);
            }
        }

您不能以这种方式运行
cd
,因为
cd
不是真正的程序;它是命令行的内置部分,它所做的只是更改命令行的环境。在子流程中运行它是没有意义的,因为您正在更改该子流程的环境-但是该子流程立即关闭,丢弃其环境

要在实际Java程序中设置当前工作目录,应编写:

System.setProperty("user.dir", "C:\\Program Files\\Flowella");

从Java程序的不同目录到工作目录运行进程的一种方法是更改目录,然后在同一命令行中运行进程。您可以通过获取
cmd.exe
来运行命令行,例如
cd some\u目录和&some\u程序

下面的示例更改为不同的目录,并从那里运行
dir
。诚然,我可以只
dir
那个目录,而不需要
cd
到它,但这只是一个例子:

import java.io.*;

public class CmdTest {
    public static void main(String[] args) throws Exception {
        ProcessBuilder builder = new ProcessBuilder(
            "cmd.exe", "/c", "cd \"C:\\Program Files\\Microsoft SQL Server\" && dir");
        builder.redirectErrorStream(true);
        Process p = builder.start();
        BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while (true) {
            line = r.readLine();
            if (line == null) { break; }
            System.out.println(line);
        }
    }
}
还要注意,我正在使用一个
ProcessBuilder
来运行该命令。除此之外,这允许我通过调用
redirectErrorStream(true)
将进程的标准错误重定向到其标准输出中。这样做只会给我一个流来读取

这为我的机器提供了以下输出:

C:\Users\Luke\StackOverflow>java CmdTest
驱动器C中的卷是Windows7
卷序列号为D8F0-C934
C:\Program Files\Microsoft SQL Server目录
29/07/2011  11:03              .
29/07/2011  11:03              ..
21/01/2011  20:37              100
21/01/2011  20:35              80
21/01/2011  20:35              90
2011年1月21日20:39 MSSQL10_50.SQLEXPRESS
0个文件0个字节
6个目录209496424448个可用字节

如果要执行类似于
cd
的操作,请使用:

String[] command = {command_to_be_executed, arg1, arg2};
ProcessBuilder builder = new ProcessBuilder(command);
builder = builder.directory(new File("directory_location"));
例如:

String[] command = {"ls", "-al"};
ProcessBuilder builder = new ProcessBuilder(command);
builder = builder.directory(new File("/ngs/app/abc"));
Process p = builder.start();
必须将命令和所有参数拆分为字符串数组的单独字符串(否则,
ProcessBuilder
API将无法正确提供这些参数)。

请尝试以下操作:

Process runtime = Runtime.getRuntime().exec("cmd /c start notepad++.exe");

下面是命令行执行的一个更完整的实现

用法 输出:

12/27/2017 11:18:11:732: ls
12/27/2017 11:18:11:820: build.gradle
12/27/2017 11:18:11:820: gradle
12/27/2017 11:18:11:820: gradlew
12/27/2017 11:18:11:820: gradlew.bat
12/27/2017 11:18:11:820: out
12/27/2017 11:18:11:820: settings.gradle
12/27/2017 11:18:11:820: src
代码
最简单、最短的方法就是使用图书馆


您可以找到更多示例。

从java执行cmd的方法之一

public void executeCmd() {
    String anyCommand="your command";
    try {
        Process process = Runtime.getRuntime().exec("cmd /c start cmd.exe /K " + anyCommand);

    } catch (IOException e) {
        e.printStackTrace();
    }
}

这里的值加法器是使用符号批处理命令和正确的格式来更改cd驱动器

public class CmdCommander {

public static void main(String[] args) throws Exception {
    //easyway to start native windows command prompt from Intellij

    /*
    Rules are:
    1.baseStart must be dual start
    2.first command must not have &.
    3.subsequent commands must be prepended with &
    4.drive change needs extra &
    5.use quotes at start and end of command batch
    */
    String startQuote = "\"";
    String endQuote = "\"";
    //String baseStart_not_taking_commands = " cmd  /K start ";
    String baseStart = " cmd  /K start cmd /K ";//dual start is must

    String first_command_chcp = " chcp 1251 ";
    String dirList = " &dir ";//& in front of commands after first command means enter
    //change drive....to yours
    String changeDir = " &cd &I: ";//extra & makes changing drive happen

    String javaLaunch = " &java ";//just another command
    String javaClass = " Encodes ";//parameter for java needs no &

    String javaCommand = javaLaunch + javaClass;
    //build batch command
    String totalCommand =
            baseStart +
                    startQuote +
                    first_command_chcp +
                    //javaCommand +
                    changeDir +
                    dirList +
                    endQuote;

    System.out.println(totalCommand);//prints into Intellij terminal
    runCmd(totalCommand);
    //Thread t = Thread.currentThread();
    //t.sleep(3000);
    System.out.println("loppu hep");//prints into Intellij terminal

}


public static void runCmd(String command) throws Exception {

    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(command);


}
}公共课堂演示{ 公共静态void main(字符串args[])引发IOException{

    Process process = Runtime.getRuntime().exec("/Users/******/Library/Android/sdk/platform-tools/adb" + " shell dumpsys battery ");
    BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line = null;
    while (true) {
        line = in.readLine();
        if (line == null) { break; }
        System.out.println(line);
    }
}

}

可通过以下代码停止和禁用服务:

static void sdService() {
    String[] cmd = {"cmd.exe", "/c", "net", "stop", "MSSQLSERVER"};
    try {           
        Process process = new ProcessBuilder(cmd).start();
        process.waitFor();      
        String line = null;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
                            
        line = null;
        bufferedReader = null;
        Process p = Runtime.getRuntime().exec("sc config MSSQLSERVER start= disabled");
        p.waitFor();
        bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }                   
    } catch (Exception e) {
        e.printStackTrace();
    }                   
}
可以通过以下代码启用和启动服务

static void esService() {
    String[] cmd = {"cmd.exe", "/c", "net", "start", "MSSQLSERVER"};
                    
    try {
        Process p = Runtime.getRuntime().exec("sc config MSSQLSERVER start= auto");
        //Process p = Runtime.getRuntime().exec("sc config MSSQLSERVER start= demand");
        p.waitFor();        
        String line = null;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
                            
        line = null;
        bufferedReader = null;
        Process process = new ProcessBuilder(cmd).start();          
        process.waitFor();
        bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
                        
    } catch (Exception e) {
        e.printStackTrace();
    }               
}
可以通过下面的代码从任何文件夹执行命令

static void runFromSpecificFolder() {       
    try {
        ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "cd \"C:\\Users\\himan\\Desktop\\Java_Test_Deployment\\jarfiles\" && dir");
        //processBuilder.directory(new File("C://Users//himan//Desktop//Java_Test_Deployment//jarfiles"));
        processBuilder.redirectErrorStream(true);
        Process p = processBuilder.start();
        p.waitFor();        
        String line = null;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }                
    } catch (Exception e) {
        e.printStackTrace();
    }               
}
    
public static void main(String args[]) {
    sdService();
    runFromSpecificFolder();
    esService();
}

我应该在哪里添加这一行,你是指Runtime.getRuntime().exec(“cd-what?”);你能给我一个cd命令的例子吗。编辑我的答案希望能增加一些清晰度。谢谢,但我得到java.io.IOException:无法运行程序“cd”:CreateProcess error=2,系统找不到java.lang.ProcessBuilder.start指定的文件(未知源)@Reham查看我的修订答案,了解为什么不能按您希望的方式使用特定命令。Re:“在Java程序中,您不能更改当前工作目录,也不需要”:这不是真的。查看我的答案。可能是因为您使用的是
Runtime.getRuntime().exec(…)
而不是
ProcessBuilder
?就个人而言,我认为
Runtime.getRuntime().exec(…)
已经被弃用了。(虽然被否决的不是我。)我不是被否决的人,但是--您的代码几乎与OP已经拥有的代码完全相同。它不会解决OP当前存在的任何问题。非常感谢:)我在cd后面放了另一个命令,我想在当前目录下执行它,它使用了一些android命令,但它给了我android“不被识别为内部或外部命令,尽管它在cmd上工作,我将路径添加到环境变量中。这听起来像是一个
路径
问题。请尝试打印出值查看它是否包含您提到的Android命令的路径。(使用
static void sdService() {
    String[] cmd = {"cmd.exe", "/c", "net", "stop", "MSSQLSERVER"};
    try {           
        Process process = new ProcessBuilder(cmd).start();
        process.waitFor();      
        String line = null;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
                            
        line = null;
        bufferedReader = null;
        Process p = Runtime.getRuntime().exec("sc config MSSQLSERVER start= disabled");
        p.waitFor();
        bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }                   
    } catch (Exception e) {
        e.printStackTrace();
    }                   
}
static void esService() {
    String[] cmd = {"cmd.exe", "/c", "net", "start", "MSSQLSERVER"};
                    
    try {
        Process p = Runtime.getRuntime().exec("sc config MSSQLSERVER start= auto");
        //Process p = Runtime.getRuntime().exec("sc config MSSQLSERVER start= demand");
        p.waitFor();        
        String line = null;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
                            
        line = null;
        bufferedReader = null;
        Process process = new ProcessBuilder(cmd).start();          
        process.waitFor();
        bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
                        
    } catch (Exception e) {
        e.printStackTrace();
    }               
}
static void runFromSpecificFolder() {       
    try {
        ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "cd \"C:\\Users\\himan\\Desktop\\Java_Test_Deployment\\jarfiles\" && dir");
        //processBuilder.directory(new File("C://Users//himan//Desktop//Java_Test_Deployment//jarfiles"));
        processBuilder.redirectErrorStream(true);
        Process p = processBuilder.start();
        p.waitFor();        
        String line = null;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }                
    } catch (Exception e) {
        e.printStackTrace();
    }               
}
    
public static void main(String args[]) {
    sdService();
    runFromSpecificFolder();
    esService();
}