无法使用java Process类执行PowerShell命令,而所有其他命令都工作正常

hc2pp10m  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(173)

我尝试使用java Process类执行下面的命令,但它没有给我任何响应,也没有它应该做的效果。
但是当我直接在PowerShell上执行这个命令时,它工作正常,只是它不能使用java代码。我试过其他PowerShell命令,所有的命令都工作正常,接受这个命令。
这是一个禁用驱动器索引的命令。
输出其唯一的打印命令,并在响应isAlive()方法调用时返回false。
命令:powershell.exe Get-WmiObject -Class Win32_Volume -Filter "DriveLetter='I:'" | Set-WmiInstance -Arguments @{IndexingEnabled=$False}
活动:假
代码中没有其他内容,我只是从我的主类中调用此方法,就像classObject.disableIndexing("D")
注意我只使用管理员权限执行相同的操作。请帮助。

public String disableIndexing(String driveLetter) {
        
    String returnVal="";
    String command = "powershell.exe Get-WmiObject -Class Win32_Volume -Filter \"DriveLetter='"+driveLetter+":'\" | Set-WmiInstance -Arguments @{IndexingEnabled=$False} ";
    try {   
        System.out.println(command);
        Process p = Runtime.getRuntime().exec(command);
        p.waitFor();
        String line1="";
        String line="";
        BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
        while ((line1 = br.readLine()) != null) {
                    System.out.println(line1);
            if(!line1.isEmpty())
            System.err.println(line1);
        }
        System.out.println(p.isAlive());
        if(p.exitValue()==0) {
            returnVal="Indexing changed Successfully";
                }else {
            returnVal="Your Drive is Not Responding Try After Some Time";
            }
    }catch(Exception e) {
        e.printStackTrace();
            
    }
    return returnVal;
        
}
bgtovc5b

bgtovc5b1#

这里的问题可能是|在传递到powershell.exe之前被默认shell(例如cmd.exe)解释。
要解决此问题,请使用-EncodedCommand命令行开关将命令安全地传递给powershell.exe

public String disableIndexing(String driveLetter) {
    String driveLetter = "D";
    String powerShellCommand = "Get-WmiObject -Class Win32_Volume -Filter \"DriveLetter='" + driveLetter + ":'\" | Set-WmiInstance -Arguments @{IndexingEnabled=$False}";

    // Base64-encode the UTF16LE representation of the command
    byte[] powerShellBytes = powerShellCommand.getBytes(StandardCharsets.UTF_16LE);
    String encodedCmd = new String(Base64.getEncoder().encode(powerShellBytes));

    String command = "powershell.exe -EncodedCommand " + encodedCmd;

    try {
        // proceed the same as before ...
    }
    catch (Exception e) {
        // ...
    }

    return returnVal;
}

相关问题