我正在开发一个Java宏,它在另一个程序中运行,作为计算流体动力学包的一部分。让我对这个软件包感到恼火的一件事是,显示器处于待机状态似乎会暂停模拟。但是看到我可以访问这些宏,我想我会添加一个部分来更改我的电源设置以保持显示器清醒。
我对Java很新,因此我发现最简单的方法是调用PowerScript来进行实际的设置更改。到目前为止,我能够使用以下内容读取设置的当前状态(由于此部分有效,因此为了可读性而隐藏)。
String command;
command = "powershell.exe $p = Get-CimInstance -Name root\\cimv2\\power -Class win32_PowerPlan -Filter \"IsActive=\'True\'\"; $p.ElementName";
Process powerShellProcess = Runtime.getRuntime().exec(command);
powerShellProcess.getOutputStream().close();
String line;
BufferedReader stdout = new BufferedReader(new InputStreamReader(
powerShellProcess.getInputStream()));
line = stdout.readLine();
System.out.println("The current power mode is: "+line);
stdout.close();
下一步是使用以下内容设置电源设置:
String powerMode = "Balanced";
command = "powershell.exe $p = Get-CimInstance -Name root\\cimv2\\power -Class win32_PowerPlan -Filter \"ElementName=\'"+powerMode+"\'\"; Invoke-CimMethod -InputObject $p[0] -MethodName Activate";
System.out.println(command);
powerShellProcess = Runtime.getRuntime().exec(command);
powerShellProcess.getOutputStream().close();
new InputStreamReader(powerShellProcess.getInputStream());
命令正确打印为
powershell.exe $p = Get-CimInstance -Name root\cimv2\power -Class win32_PowerPlan -Filter "ElementName='Balanced'"; Invoke-CimMethod -InputObject $p[0] -MethodName Activate
在PowerShell中运行该命令(当然减去“powershell.exe”)时效果很好,但是当从Java调用它时会导致-Filter“ElementName ='Balanced'”返回null。
有谁能告诉我为什么过滤器参数没有正确传递?当按照“IsActive”进行过滤时,它可以正常工作,如第一部分所示,但在按“ElementName”过滤时则不行。它可能与元素名称周围的转义序列噩梦有关吗?
答案 0 :(得分:3)
Powershell在处理命令行上的引号方面非常挑剔。简单的解决方案是以
的形式发送查询-Filter 'ElementName=\"Balanced\"'