1

JavaでProcessBuilderを介してvmrunを実行するのに多くの問題があります。

私はこのようなコマンド文字列を持っています:

java -cp . RunTest 'vmrun -T esx -h https://10.123.236.123:443/sdk -u root -p password revertToSnapshot "[datastore] myVM1/myVM1.vmx" snapshot1'

上記のvmrunコマンドを(Javaなしで)実行すると、コマンドは正常に実行されます。しかし、Javaを使用すると、ffを受け取ります。エラー:

Error: Cannot open VM: "[datastore] myVM1/myVM1.vmx", unknown file suffix

コードは以下のとおりです。

   public static void main(String args[]) {
      runProcessBuilderMulti(args[0]);
   }

   static void runProcessBuilderMulti (String cmd){
        List<String> list = new ArrayList<String>();
        System.out.println("Running Command: "+cmd.replace("\"","\\\""));

        Matcher m = Pattern.compile("([^\"]\\S*|\".+?\")\\s*").matcher(cmd);
        while (m.find())
                list.add(m.group(1));

        System.out.println(list);

        try {
                Process process = new ProcessBuilder(list).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(process.exitValue());
        } catch (Exception e) {}
   }

ProcessBuilderに切り替える前にRuntime.exec()を使用しました。引用符と関係があると思ったので、cmd.replaceを追加しましたが、明らかに別の問題でした。

どんな助けでもいただければ幸いです。ありがとう!

4

1 に答える 1

1

上記のスクリプトを使用してパイプされたコマンドに問題があることを知ったとき、私はProcessBuilderで遊んでいました。もう少しグーグルは、ProcessBuilderが特定のコマンドを実行するためにシェルを開く必要があることを発見しました。

ProcessBuilder b = new ProcessBuilder("/bin/sh", "-c", "ls -l | grep daemon");

関数は次のように更新されます。

   static void runProcessBuilderMulti (String cmd){

        System.out.println("Running Command: "+cmd.replace("\"","\\\""));

        try {
                Process process = new ProcessBuilder("/bin/sh", "-c", cmd).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(process.exitValue());
        } catch (Exception e) {}
   }

パイプコマンドのように、長いコマンドは処理が難しいので、実行するには独自のシェルが必要だと思います。

于 2012-08-30T05:49:32.767 に答える