我正在尝试使用以下代码在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);
}
}
}
答案 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());
等待时间是等待最大时间。