我正在尝试在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中。
答案 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)