Java Powershell CreateProcess error = 2,系统找不到指定的文件

时间:2013-10-29 14:40:58

标签: java powershell

我在java中执行powershell命令,我编写了两个程序,但奇怪的部分是一个正常工作,另一个抛出错误。抛出错误的代码如图所示

我尝试了以下内容 1)指定powershell的完全指定路径 2)我的路径变量有以下内容 - “C:\ WINDOWS \ system32 \ WindowsPowerShell \ v1.0”

我知道我可能会做一些微不足道的事情,但这是一天,我无法弄清楚问题可能是什么

import java.io.IOException;

public class FileCount {

public static void main(String[] args) {
    Process flCntProcess = null;
    try {

        String test  = "C:\\WINDOWS\\system32\\windowspowershell\\v1.0\\powershell.exe  -Command \"& { Get-ChildItem C:\\test -Recurse -force | Measure-Object }\"";
        System.out.println("Powershell command : " + test);
        ProcessBuilder builder = new ProcessBuilder(test);
        builder.redirectErrorStream(true);
        flCntProcess = builder.start();

        //  FILE COUNT OUTPUT STREAM PROCESSING
        NotifyThreadComplete outputThread = new ProcessHandler(flCntProcess.getInputStream(),"OUTPUT");
        outputThread.addListener(new ThreadCompleteListener() {

            @Override
            public void notifyCompletion(Thread t, long startTm, boolean didErrorOut, String noOfLines) {
                System.out.println("Completed Output Stream Processing");
                System.out.println("Printing values");
                System.out.println("No of Lines : " + noOfLines);
                System.out.println("Did Error out : " + didErrorOut);

                if(didErrorOut) {
                    System.out.println("Do not continue with processing");
                } else {
                    System.out.println("Continue with processing");
                }
            }
        });
        System.out.println("Starting output thread ");
        outputThread.start();

    } catch (Exception e) {
        System.err.println("Exception while counting files using Powershell Command" + e.getMessage());
    } finally {
        if(flCntProcess != null && flCntProcess.getOutputStream() != null) {
            try {
                flCntProcess.getOutputStream().close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
}

2 个答案:

答案 0 :(得分:1)

错误代码表示无法找到要执行的文件。尝试将程序与其参数分开:

String ps  = "C:\\WINDOWS\\system32\\windowspowershell\\v1.0\\powershell.exe";
String args  = "-Command \"& { Get-ChildItem C:\\test -Recurse -force | Measure-Object}\"";        
ProcessBuilder builder = new ProcessBuilder(ps, args);

答案 1 :(得分:0)

ProcessBuilder的构造函数接受包含cli调用的单个String,但是包含按顺序包含的字符串数组:

  • 要执行的程序
  • 其论点

See the javadoc

因此它将整个字符串test解释为程序名称,将其拆分应该有效:

final String psh = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe";
final String args = "-Command & { Get-ChildItem C:\\temp -Recurse -force | Measure-Object }";
final ProcessBuilder builder = new ProcessBuilder(psh, args);