[英]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.