簡體   English   中英

如何在 Java 中寫入命令提示符?

[英]How do you write to a command prompt in Java?

背景

我從 Java 應用程序啟動了命令提示符。 現在我想在剛剛生成的命令提示符中輸入命令。 如何在 Java 程序剛剛生成的提示符中運行命令?

我試過的

我的代碼創建了一個啟動命令提示符的進程。 然后它獲取進程的 OutputStream 來嘗試寫入它。 但我沒有看到任何變化發生。 它應該只是更改目錄,然后在新目錄中運行一系列命令。

// Block that makes new command prompt
List<String> commands = new ArrayList<String>();
commands.add("cmd.exe");
commands.add("/c");
commands.add("start");
commands.add("cmd.exe");

// Block that creates a writer to write to new command prompt
ProcessBuilder pb = new ProcessBuilder(commands);
Process p = pb.start();
OutputStream os = p.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os)); 

// Block that actually writes the commands
writer.write(String.format("cd %s\n", PATH);
writer.write(OTHER_COMMANDS); // I'm ommiting the other commands because there's a lot
writer.flush();
writer.close();

我不確定為什么這些命令沒有寫入彈出的命令提示符。 我看到彈出了一個新的命令提示符,但目錄從它開始的地方沒有改變。 如何在我生成的提示中輸入命令?

您的程序 ProcessBuilder 允許您訪問進程 cmd.exe 的標准輸入、標准輸出和標准錯誤。 這些與程序 cmd.exe 打開的 window 和命令提示符的輸入和 output 和命令提示符不同

這里有一個關於如何使用 c# 的答案: Create a cmd window and write to it from ZD7EFA19FBE24D3972FD5ADB63

在 Java 我不知道類似的 API,它實際上可能需要使用 JNI 或 JNA 才能訪問您需要使用的 Windows API。 您使用的 function(通過 JNI 或 JNA)與其他答案中引用的https://docs.microsoft.com/en-us/windows/console/allocconsole相同。 所以這是一種方法,但是如果您選擇 go 這條路線,那么如何使用 JNI 或 JNA 的完整描述不在此處答案的 scope 之外。

當您寫入p時,您正在寫入此命令的標准輸入:

cmd.exe /c start cmd.exe

您正在寫第一個cmd.exe 除了開始第二個之外,它什么都不做。 獲得第二個進程的句柄是不可能的(至少不簡單)。 您可以使用/K ,並將命令與&&彼此合並。 例如:

commands.add("/K");
commands.add(String.join(" && ", OTHER_COMMANDS_AS_LIST));

據我所知,您正在嘗試實現與遠程 shell 模糊相似的東西(沒有網絡和加密的 SSH)......

這應該像您對 *nix-like shell 所期望的那樣工作,因為這些 shell 正確處理它們的標准輸入和 output,正是在需要重定向它們的情況下(通過網絡或其他方式)。

Windows cmd.exe其實並不是一個純粹的shell。 它是一個終端仿真器(屏幕上出現的黑色 window)shell,在一個進程中。 這就是為什么它沒有從標准輸入獲得輸入,也沒有在標准輸出上打印它的 output。 相反,它偵聽 GUI 鍵盤事件以進行輸入並在內部處理它們,並且 output 直接顯示在 window 中,而無需將其寫入標准輸出。

這就是為什么沒有簡單的方法來“遠程控制”cmd.exe。 它不是為此而生的。 您可以使用“正確”的 shell 嘗試此操作,例如 Cygwin 的 bash.exe,或者 PowerShell 或類似的。

令人驚訝的是,cmd.exe 在大約 20 年前被創建為一個快速且骯臟的“DOS 窗口”,至今仍然存在並且實際上用於生產工作......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM