通过Java运行cmd命令
我找到了几个通过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
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();
}