Runtime.getRuntime()。exec如何运行goto命令

时间:2015-09-30 17:48:24

标签: java command-line

我正在尝试在java应用程序中运行小命令行代码来删除自己。因此命令将继续运行并继续尝试删除文件,一旦应用程序关闭,它将被删除。

我已经厌倦了将命令传递给Runtime.getRuntime()。exec但仍无法使其工作。

例如:

SET file="program.jar"
goto :d
:r
timeout /t 1
:d
del %file%
if exist %file% goto :r

尝试这样做显然看起来不对。我累了用;而不是&&但也不起作用。

Runtime.getRuntime().exec("cmd /c \"SET file=\"program.jar\" && goto :d && :r && timeout /t 1 && :d && del %file% && if exist %file% goto :r\"");

在.bat文件中工作得很好,但我如何将其实现为java .exec()方法。 我可以运行.bat文件,但我希望所有代码都包含在java中。

1 个答案:

答案 0 :(得分:1)

首先,您无法在goto单行中使用cmd标签。请改用while TRUE循环。在cmd条款中:for /L %a in (1 0 2) do ...

其次,您需要申请Delayed Expansion。证明:

==> SET "_file=init.ext"

==> SET "_file=prog.jar" & for /L %a in (1 1 2) do @echo %_file% %time% & timeout /T 3 1>NUL
init.ext  8:05:55,33
init.ext  8:05:55,33

==> set _file
_file=prog.jar

在上面的示例中,%_file%%time%变量在解析时间内展开。
另一方面,启用了延迟展开:!_file!!time!变量在执行时间内扩展:

==> SET "_file=init.ext"

==> cmd /E /V /C SET "_file=prog.jar" ^& for /L %a in (1 1 2) do @echo !_file! !time! ^& timeout /T 3 1^>NUL
prog.jar  8:08:55,42
prog.jar  8:08:58,18

因此,您的单行内容可能如下所示(从Windows cmd CLI验证锁定文件;循环直到解锁):

cmd /E /V /C SET "_file=program.jar" ^& for /L %a in (1 0 2) do if exist "!_file!" (del "!_file!" ^& timeout /T 2) else (exit /B)