从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 rootcimv2power -Class win32_PowerPlan -Filter "ElementName='Balanced'"; Invoke-CimMethod -InputObject $p[0] -MethodName Activate

当在powershell中运行该命令(当然不包括"powershell.exe")时,效果很好,但当从Java调用该命令时,-Filter"ElementName='Balanced'"返回null。

有人能告诉我为什么过滤器参数没有正确传递吗?如第一部分所示,当通过"IsActive"进行筛选时,它可以很好地工作,但当通过"ElementName"进行过滤时则不行。这可能与元素名称周围的转义序列噩梦有关吗?

Powershell在命令行中对引号的处理非常挑剔。简单的解决方案是将查询作为发送

-Filter 'ElementName="Balanced"'

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

最新更新