在eclipse中执行powershell命令

时间:2016-02-17 10:08:17

标签: java eclipse powershell

我正在尝试使用以下代码在eclipse中运行powershell命令。 powershell脚本显示Windows上已安装应用程序的列表。在PowerShell中执行脚本时,该脚本工作正常。但是我无法在控制台上获得输出。有人可以告诉我这里有什么问题吗?

import com.profesorfalken.jpowershell.PowerShell;
import com.profesorfalken.jpowershell.PowerShellNotAvailableException;
import com.profesorfalken.jpowershell.PowerShellResponse;

public class TestProcessList {

public static void main(String[] args) throws Exception {

    try {
        PowerShell powerShell = PowerShell.openSession();
        String command = "Get-ItemProperty " + 
                "HKLM:/Software/Wow6432Node/Microsoft/Windows/CurrentVersion/Uninstall/* " + 
                "| Select-Object DisplayName, DisplayVersion, Publisher, InstallDate " + 
                "| Format-Table –AutoSize";

        PowerShellResponse response = powerShell.executeCommand(command);

        System.out.println("Proceses are:" + response.getCommandOutput());

        powerShell.close();

    } catch (PowerShellNotAvailableException ex) {
        throw new RuntimeException("Failed to run PowerShell", ex);
    }

}

}

3 个答案:

答案 0 :(得分:1)

可能会抛出一些例外情况。在你的情况下,不会被重新抛出并被消费(不良做法)。 将catch块更改为:

} catch (PowerShellNotAvailableException ex) {
    throw new RuntimeException("Failed to run PowerShell", ex)
}

然后你会看到出现了什么问题,包括它的整个堆栈跟踪和可能的原因。

<强>更新 您实际上是在单个命令中使用管道命令(执行命令字符串中的“|”)。它不会工作,因为管道不容易在java中实现。 根据命令“ps aux | grep java”的以下示例尝试解决方案:

import org.apache.commons.io.IOUtils;

public static void main(String[] args) throws Exception
{
    Process p1 = Runtime.getRuntime().exec(new String[] { "ps", "aux" });
    InputStream input = p1.getInputStream();
    Process p2 = Runtime.getRuntime().exec(new String[] { "grep", "java" });
    OutputStream output = p2.getOutputStream();
    IOUtils.copy(input, output);
    output.close(); // signals grep to finish
    List<String> result = IOUtils.readLines(p2.getInputStream());
    System.out.println(result);
}

来源:https://stackoverflow.com/a/7226858/1688570

由于我不知道PowerShell库的API,您必须自己调整示例以使用PowerShell库。

答案 1 :(得分:0)

代码来自PowerShell.java类。

int closingTime = 0;

while (!closeTask.isDone () 
    && !closeTask.isDone()) {
            if (closingTime > MAX_WAIT) {
        Logger.getLogger(PowerShell.class.getName()).log(Level.SEVERE, "Unexpected error when closing PowerShell: TIMEOUT!");
        break;
    }
    Thread.sleep(WAIT_PAUSE);
    closingTime += WAIT_PAUSE;

static final int WAIT_PAUSE = 10;
static final int MAX_WAIT = 2000;

这意味着您的命令需要超过2000毫秒才能关闭/完成。 我认为在您的代码中添加自定义睡眠可能有帮助。我不熟悉JPowerShell,你应该看一下PowerShell课程。或尝试使用TouDick的答案。

答案 2 :(得分:0)

您必须添加一些等待时间。我正在使用Java执行某些命令,即使正在使用response.getCommandOutput(),也无法在控制台上打印命令输出。因此,我在下面尝试通过添加等待:

PowerShellResponse response;
Map<String, String> maxWait = new HashMap<String, String>();
maxWait.put("maxWait", "300000");
PowerShell powerShell = PowerShell.openSession().configuration(maxWait);
response = powerShell.executeCommand(yourCommand);
System.out.println(response.getCommandOutput());

等待时间是等待最大时间。