package ch.claude_martin.foo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; public class SomeClass { public static void main(String[] args) throws InterruptedException { try { // The old CMD on Windows uses UTF-16: var utf16 = Charset.forName("UTF-16LE"); System.out.println(execute("cmd /U /C echo hello", utf16)); // Linux usually has UTF-8 as the default encoding: var utf8 = Charset.forName("UTF-8"); // using WSL we can easily access the Linux subsystem: System.out.println(execute("wsl echo hello", utf8)); // You get a List. Use .get(0) to get the first line: System.out.println(execute("wsl uname -a", utf8).get(0)); // This only works when Windows is installed on C:\ System.out.println(execute("wsl ls /mnt/c/Users", utf8)); // But you can combine CMD and WSL to make sure you get the correct paths: var home = execute("cmd /U /C echo %USERPROFILE%", utf16).get(0); System.out.println(execute(String.format("wsl wslpath '%s'", home), utf8)); } catch (IOException e) { e.printStackTrace(); } } /** * Run given command and return the data read from stdout. * * @param cmd the command, for example "cmd /U /C echo foo" * @return The output of the command as a List of Strings. * @throws IOException Thrown when executing the command or reading the data * fails. */ public static List execute(final String cmd, Charset encoding) throws IOException { Process p = null; try { p = Runtime.getRuntime().exec(cmd); try (var br = new BufferedReader(new InputStreamReader(p.getInputStream(), encoding))) { List result = new ArrayList<>(); for (;;) { String line = br.readLine(); if (line == null) break; result.add(line); } return result; } } finally { if (p != null) p.destroy(); } } }