我正在尝试使用Cygwin从我的Windows操作系统运行shell脚本。当我从命令提示符运行时,它正常工作,因为我去洞察 C:\ cygwin \ bin 并运行 sh my_script.sh 。
当我通过代码获取以下错误时尝试此操作
C:\Java\jdk1.6\bin>java CmdProcessBuilder
Exception in thread "main" java.io.IOException: Cannot run program "C:\cygwin\bi
n\my_script.sh": CreateProcess error=193, %1 is not a valid Win32 application
at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
at CmdProcessBuilder.main(CmdProcessBuilder.java:13)
Caused by: java.io.IOException: CreateProcess error=193, %1 is not a valid Win32
application
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
at java.lang.ProcessImpl.start(ProcessImpl.java:30)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
... 1 more
以下是代码:
public static void main(String args[])
throws InterruptedException,IOException
{
List<String> command = new ArrayList<String>();
command.add(System.getenv("cygwin") +"\\bin\\"+"sh my_script.sh");
ProcessBuilder builder = new ProcessBuilder(command);
final Process process = builder.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("Program terminated!");
}
当我在命令提示符下尝试 cd cygwin \ bin \ sh my_script.sh 时,它没有执行给出错误消息msg 系统找不到指定的路径。
答案 0 :(得分:1)
使用Runtime.exec
这样的运气可能会更好:
String fs = System.getProperty("file.separator");
String command = System.getenv("cygwin") + fs + "bin" + fs + "sh my_script.sh";
Process p = Runtime.getRuntime().exec(command);
最好避免在路径中使用依赖于平台的字符串。
答案 1 :(得分:0)
您是否尝试用
替换命令?./cygdrive/c/cygwin/bin/my_script.sh
?如果你想从你的拥有,你可能需要用
替换你的命令command.add(System.getenv("cygwin") +"\\\\bin\\\\"+"sh my_script.sh");
执行
C:\cygwin\\bin\\my_script.sh
这是如何在cygwin中使用windows样式路径。
答案 2 :(得分:0)
我注意到你的构造有一点是你可能没有正确构建命令字符串。阅读ProcessBuilder文档(之前没有使用过这个文档),你正在构建一个带有List of Strings的进程命令,但是第一个字符串是命令,其他是参数。你构建comamnd的方式:
List<String> command = new ArrayList<String>();
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh " + "my_script.sh");
ProcessBuilder builder = new ProcessBuilder(command);
似乎创建了 包含 脚本名称的命令名称。将通话更改为:
List<String> command = new ArrayList<String>();
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh ");
command.add("my_script.sh");
ProcessBuilder builder = new ProcessBuilder(command);
并检查错误。然后,检查是否找不到c:\ cygwin \ bin \ sh.exe或者找不到脚本本身的问题。你提到尝试失败的 cd ,那么相对于java类文件的 my_script.sh 脚本在哪里?当您调用 sh 命令时,它可能无法找到 my_script.sh 文件,因为工作目录可能不在您认为的位置。
您可能尝试的一件事是确定 sh.exe 认为它正在运行的位置。从您的Java代码中,您应该可以使用以下命令调用shell:
List<String> command = new ArrayList<String>();
String fs = System.getProperty("file.separator");
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh");
command.add("-c");
command.add("pwd");
这个输出应该是shell命令认为它正在运行的目录。如果这不是实际 my_script.sh 的位置,您可能需要完全路径到脚本本身(作为cygwin格式的示例路径)
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh");
command.add("/usr/local/scripts/my_script.sh");
这是我开始调试的地方。