[英]Cannot execute WMI query from Java in PowerShell
我使用以下Java代碼執行PowerShell命令:
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* Operations for executing Windows Powershell Scripts from Java.
*
* @author Brian Thorne
*/
public class Sample
{
public static void main(String[] args) throws Exception
{
String s = executePSCommand("gwmi Win32_PhysicalMemory | Select Speed");
System.out.println(s);
}
/**
* Executes a Powershell command.
*
* @param command the command
* @return the result as String.
* @throws Exception if an error occurs
*/
public static String executePSCommand(String command) throws Exception
{
String cmd = "cmd /c powershell -ExecutionPolicy RemoteSigned -noprofile -noninteractive " + command;
return exec(cmd);
}
/**
* Executes a Powershell script.
*
* @param scriptFilename the filename of the script
* @param args any arguments to pass to the script
* @return the result as String.
* @throws Exception if an error occurs
*/
public static String executePSScript(String scriptFilename, String args) throws Exception
{
if (!new File(scriptFilename).exists())
throw new Exception("Script file doesn't exist: " + scriptFilename);
String cmd = "cmd /c powershell -ExecutionPolicy RemoteSigned -noprofile -noninteractive -file \"" + scriptFilename + "\"";
if (args != null && args.length() > 0)
cmd += " " + args;
return exec(cmd);
}
/**
* Executes a batch file. If you want to call Powershell from the batch file you need to do it using this syntax: powershell -ExecutionPolicy RemoteSigned -NoProfile
* -NonInteractive -File c:/temp/script.ps1
*
* @param batchFilename the filename of the batch file
* @param params any parameters to pass to the batch file
* @return the result as String.
* @throws Exception if an error occurs
*/
public static String executeBatchFile(String batchFilename, String params) throws Exception
{
if (!new File(batchFilename).exists())
throw new Exception("Batch file doesn't exist: " + batchFilename);
String cmd = "cmd /c \"" + batchFilename + "\"";
if (params != null && params.length() > 0)
cmd += " " + params;
return exec(cmd);
}
private static String exec(String command) throws Exception
{
StringBuilder sbInput = new StringBuilder();
StringBuilder sbError = new StringBuilder();
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);
proc.getOutputStream().close();
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String line;
while ((line = bufferedreader.readLine()) != null)
{
sbInput.append(line).append("\n");
}
inputstream = proc.getErrorStream();
inputstreamreader = new InputStreamReader(inputstream);
bufferedreader = new BufferedReader(inputstreamreader);
while ((line = bufferedreader.readLine()) != null)
{
sbError.append(line).append("\n");
}
if (sbError.length() > 0)
throw new Exception("The command [" + command + "] failed to execute!\n\nResult returned:\n" + sbError.toString());
return "The command [" + command + "] executed successfully!\n\nResult returned:\n" + sbInput.toString();
}
}
在PowerShell中,我可以成功執行此查詢:
gwmi Win32_PhysicalMemory | Select Speed
但是,當我使用Java代碼執行查詢時,會得到以下結果:
Exception in thread "main" java.lang.Exception: The command [cmd /c powershell -ExecutionPolicy RemoteSigned -noprofile -noninteractive gwmi Win32_PhysicalMemory | Select Speed] failed to execute!
Result returned:
'Select' is not recognized as an internal or external command,
operable program or batch file.
我想這個字符就是問題所在|
。 有沒有什么辦法解決這一問題?
嘗試在命令中添加單個語音標記
String s = executePSCommand("'gwmi Win32_PhysicalMemory | Select Speed'");
或逃脫管道
String s = executePSCommand("gwmi Win32_PhysicalMemory \\| Select Speed");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.