从Java程序运行时Powershell不一致

时间:2015-03-24 17:30:45

标签: java powershell

我正在开发一个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”过滤时则不行。它可能与元素名称周围的转义序列噩梦有关吗?

1 个答案:

答案 0 :(得分:3)

Powershell在处理命令行上的引号方面非常挑剔。简单的解决方案是以

的形式发送查询
-Filter 'ElementName=\"Balanced\"'

有关详细信息,请参阅 https://connect.microsoft.com/PowerShell/feedback/details/376207/executing-commands-which-require-quotes-and-variables-is-practically-impossible