我正在尝试在 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 中。
最佳答案
首先,您不能在 cmd
单行代码中使用 goto
标签。请改用某种 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)
关于java - Runtime.getRuntime().exec 如何运行 goto 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32872609/