【问题标题】:Runtime.getRuntime().exec(), hide the console screenRuntime.getRuntime().exec(),隐藏控制台屏幕
【发布时间】:2009-06-15 10:01:14
【问题描述】:

我正在使用 Java 代码执行批处理文件。代码如下:

Process proc = null;

proc = Runtime.getRuntime().exec("cmd /c start somebat.bat");

这样,正常的命令提示符屏幕就会打开。现在我想抑制/隐藏命令提示符窗口(黑色的)。我在某处发现,如果我从命令中删除 start 属性,它不会出现,但是从命令中删除它时,命令不会执行,也不会显示任何异常。

谁能告诉我如何抑制这个窗口?

【问题讨论】:

  • 在批处理脚本的末尾添加一个出口。

标签: java runtime.exec


【解决方案1】:

你试过“开始”的B选项吗?

proc = Runtime.getRuntime().exec("cmd /c start /B somebat.bat");

编辑:
好的,Anish,你的代码没有被执行,这很有趣。
我设置了一个单元测试:

Process proc = null;
    try
    {
        proc = Runtime.getRuntime().exec("cmd /c start /B D:\\temp\\_test\\somebat.bat");
        proc = Runtime.getRuntime().exec("cmd /c call D:\\temp\\_test\\somebat.bat");
        proc = Runtime.getRuntime().exec("D:\\temp\\_test\\somebat.bat");
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

我的 somebat.bat 文件如下所示:

rem somebat.bat:
d:
cd D:\temp\_test
copy somebat.bat somebat2.bat

上面 try-block 中的所有三个版本都适用于我的场景。 Somebat.bat 被复制到 somebat2.bat 没有弹出命令窗口(如果我使用你的电话,会发生什么,如你的问题所示)。

编辑 2: 下一轮 ;-)
Anish,你能告诉我们你的 somebat.bat 和你的 ant 文件是什么样的吗?
因为下面的所有三个调用都适用于我的场景:

测试代码:

Process proc = null;
proc = Runtime.getRuntime().exec("cmd /c start /B c:\\temp\\_test\\somebat.bat");
proc = Runtime.getRuntime().exec("cmd /c call c:\\temp\\_test\\somebat.bat");
proc = Runtime.getRuntime().exec("c:\\temp\\_test\\somebat.bat");

somebat.bat:

cd\temp\_test  
ant mycopy  

build.xml:

<?xml version="1.0"?>
<project name="testproj" default="mycopy" basedir=".">
  <target name="mycopy">
      <copy file="myfile.txt" tofile="mycopy.txt" />
  </target>
</project>

myfile.txt:任意文本文件

【讨论】:

  • 嗨 John Nopes /B 也不能解决我的问题。批处理文件未执行。
  • 实际上我的批处理文件中正在执行一个 ant 命令。它仅通过以下调用执行。使用其他选项,它永远不会被执行。 "cmd /c start D:\\temp\_test\\somebat.bat"
  • 如果您只执行一个 ant 命令,您也可以考虑直接从 java 执行此操作:所有 Ant 任务都可以作为类访问并运行(给定适当的配置),并且 Ant 本身也可以被调用从 Java 内部(参见例如:ibm.com/developerworks/websphere/library/techarticles/…
  • 它执行批处理,但它只执行程序的一个副本,如果它默认执行它也会使其瘫痪。
【解决方案2】:
Process proc = null;
proc = Runtime.getRuntime().exec("cmd /c start C:\temp\somebat.bat");

【讨论】:

【解决方案3】:

您可以使用“运行”而不是“开始”。

Runtime.getRuntime().exec("cmd /c run somebat.bat");

【讨论】:

    【解决方案4】:

    你试过了吗

    start /min "title" "c:\path\batchfile.bat"
    

    这将在没有窗口的情况下运行您的批处理文件。但是,它仍会出现在任务栏中(因为它已最小化)

    【讨论】:

    • 嗨,Brian,我需要完全隐藏提示屏幕。此选项只会最小化窗口。
    【解决方案5】:

    看看这个forum post。其中一个答案建议使用vbs script 来隐藏窗口。

    【讨论】:

      【解决方案6】:

      试试这个:

      Runtime.getRuntime().exec(cmd.exe /K C:/path/batchfile.bat);

      【讨论】:

        【解决方案7】:

        我不太了解windows,但我建议你省略命令的“cmd”位。 cmd.exe 是 Windows 终端。只是一个猜测。查找其他 exec() 方法,其中有一个需要运行命令可执行文件和参数。至少在 UNIX 上,您通常不能做任何 shell 不支持的事情(比如将输出通过管道传输到文件),因为这些是 shell 功能,而不是由被调用程序完成的。可能是你发现如果你删除 cmd 前缀有些东西不起作用的原因。

        试一试:

        Process proc = Runtime.getRuntime().exec("somebat.bat");

        【讨论】:

        • 嗨,给定的选项不起作用。 bat文件没有执行。
        • 您是否尝试指定完整路径?
        猜你喜欢
        • 1970-01-01
        • 2021-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 2015-08-28
        相关资源
        最近更新 更多