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<String> 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<String> result = new ArrayList<>();
for (;;) {
String line = br.readLine();
if (line == null)
break;
result.add(line);
}
return result;
}
} finally {
if (p != null)
p.destroy();
}
}
}
Comments
0 B
|👍
/👎