0

我正在使用 Java ProcessStream 将输入命令写入本地计算机上的 powershell。现在,问题是除了输出之外,我还看到了输入命令。如何限制输入命令显示在输出中。

下面是重现相同的代码:

public class Example {
    public static boolean isAlive(Process o) {
        try {
            p.exitValue();
            return false;
        } catch (Exception e) {return true;}
    }
    
    public stati void main(String[] args) throws IOException {
        ProcessBuilder builder = new ProcessBuilder("powershell");
        builder.redirectErrorStream(true);
        Process process = builder.start();
        InputStream out = process.getInputStream();
        OutputStream in = process.getOutputStream();
        String bufferString = "echo hello \n";
        byte[] buffer = bufferString.getBytes();
        int n = buffer.length;
        
        in.write(buffer, 0, n);
        in.flush();
        
        while(isAlive(process)) {
            int no = out.available();
            if (no >0) {
                int m = out.read(buffer, 0, Math.min(no, buffer.length));
                System.out.println(new String(buffer, 0, m));
            }
        }
    }
}

OUTPUT:

PS C://> echo hello
hello

我只需要输出中的“你好”。

4

1 回答 1

0

以下对我有用(但java程序永远不会终止,我必须杀死它)。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

public class Example {
    public static boolean isAlive(Process p) {
        try {
            p.exitValue();
            return false;
        }
        catch (Exception e) {
            return true;
        }
    }
    
    public static void main(String[] args) throws IOException {
        ProcessBuilder builder = new ProcessBuilder("powershell", "-NoLogo");
        builder.redirectErrorStream(true);
        Process process = builder.start();
        InputStream is = process.getInputStream();
        try (InputStreamReader isr = new InputStreamReader(is);
             BufferedReader out = new BufferedReader(isr)) {
            OutputStream in = process.getOutputStream();
            String bufferString = "echo hello" + System.lineSeparator();
            byte[] buffer = bufferString.getBytes();
            in.write(buffer);
            in.flush();
            while (isAlive(process)) {
                String line = out.readLine();
                if (!line.startsWith("PS")) {
                    System.out.println(line);
                }
            }
        }
    }
}

上述代码产生的输出很简单:

hello

@talex 在他对您的问题的评论中提到了以下内容:

无法摆脱PS C://>一部分

这不是真的,因为您可以自定义PowerShell 提示符,但您写道您不想echo hello在输出中看到 ,这是不可能的,因此,正如@talex 提到的:

您必须自己过滤输入流

不显示echo hello是指不显示输入的命令。想象一下,您打开一个PowerShell窗口,但看不到您输入的命令,但在您点击后,ENTER您想看到输出。所以我认为没有办法不显示echo hello,因此,在上面的代码中,我不打印以PowerShell提示符开头的行。

您可以在about_PowerShell_exe中找到有关启动PowerShell的详细信息

于 2021-04-09T14:49:24.950 回答