【问题标题】:How can I change the cmd working directory from java?如何从 java 更改 cmd 工作目录?
【发布时间】:2023-03-14 09:51:01
【问题描述】:

我正在尝试执行不在默认工作目录中的 bat 文件(来自 java 内)。我尝试了下面的代码,但它似乎不适用于“CD”命令。

    String executeCommand(String command) {

    StringBuffer output = new StringBuffer();

    Process p;
    try {

        p = Runtime.getRuntime().exec(command);
        p.waitFor();
        BufferedReader reader =
                new BufferedReader(new InputStreamReader(p.getInputStream()));

        String line = "";
        while ((line = reader.readLine())!= null) {
            output.append(line + "\n");
        }

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

    return output.toString();

}

/////////////////////////////////////// ////////// 这是应该执行命令的代码 ///////////////////////////////////////// //////

    String command = "cd C:\usmt" ;

    //in windows
    //String command = "ping -n 3 " + domainName;

    String output = obj.executeCommand(command);

    System.out.println(output);

【问题讨论】:

  • 你给出了什么意见。你得到什么输出。你期待什么输出?当你调试它时会发生什么?发布新问题时,您应该始终回答这些问题。代码已经成功了一半,现在我们需要了解您在做什么。
  • 使用ProcessBuilder,它有directory属性,允许你指定执行命令时使用的工作目录
  • 当 windows 执行系统命令时,它会创建一个新的 shell,就像我打开两个 cmd 提示符它们有不同的工作目录一样。

标签: java powershell cmd


【解决方案1】:

试试这样的:

public class CmdTest {
    public static void main(String[] args) throws Exception {
        ProcessBuilder builder = new ProcessBuilder(
            "cmd.exe", "/c", "cd \"C:\\Program Files\\myfile.txt");
        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);
        }
    }
}

如果您尝试在没有 cd 的情况下执行此操作,请使用:

 ProcessBuilder builder = new ProcessBuilder(
            "cmd.exe", "/c", "C:\\Program Files\\myfile.txt");

【讨论】:

  • 该代码编译,但我仍然得到相同的错误 Cannot run program "scanstate.bat": CreateProcess error=2, The system cannot find the file specified
  • 不要执行 cd,而是转到实际目录,例如: ` ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", "C:\\Program Files\\myfile. txt");`
【解决方案2】:

这取决于您要完成的工作。如果您希望您的 java 程序有一个新的 CWD,那么您将做一件事。如果您想执行一个子外壳(如另一个答案所假设的那样),您可以按照该答案所说的去做。

我会假设前者。每个 Windows 进程都有自己的 CWD。如果您生成一个更改其 CWD 的进程,则生成进程不受影响。

用于更改进程 CWD 的 Win32 API 是 SetCurrentDirectory。我对Java知之甚少,我早就忘记了。也许 java 有一个在其实现中调用 SetCurrentDirectory 的 API。或者,如果 java 有类似 .NETs P/Invoke(托管代码调用非托管 API 的一种方式),您可以使用它。

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 2020-06-05
    • 2023-01-17
    • 2015-05-11
    • 2014-12-02
    • 2015-02-22
    • 2016-05-23
    • 2016-03-14
    • 2010-10-24
    相关资源
    最近更新 更多