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

标签 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 中。

最佳答案

首先,您不能在 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/

相关文章:

c - 使用文件符号和命令行语句从文件中获取输入并将其保存在 C 语言中的另一个文件中。无法获取输出

java - 从命令行获取 pom.xml 属性

linux - 在命令行中同时执行两个命令

java - 当我尝试将 JTree 添加到 JFrame 时,JTree 不更新

java - Android XML规范化

java - 如何将 2 个长值格式化为百分比格式?

command-line - Tesseract OCR 仅检测用户词

macos - Mac 上 ~/bin 与/usr/local/bin 的区别

java - Tomcat WebDAV 缺少 Content-Length header

java - 使用 DrawerLayout 后退按钮返回到上一个 Activity