0

我有一个.bat启动java程序的脚本。该java程序删除所在的文件夹.bat。我没有办法接触java程序。我只能修改.bat文件。

问题是.bat文件一旦被删除,就会立即停止执行而没有完成。java但是程序退出后还有一些清理工作要做。

我试图将.bat文件复制到其他地方并在不会被删除的位置启动它。唉,一旦原件.bat被删除,因为它仍在执行中,同样的崩溃发生了,它没有完成。

这是两个示例文件(出于示例的目的,我们假设它们位于D:\tmp):

删除.bat

echo "delete start"

pause

del launch.bat

pause

echo "delete end"

启动.bat

echo "launch start"

setlocal enabledelayedexpansion enableextensions 

if "%CD%"=="C:\tmp" (

    echo "in temp"
    d:
    cd \tmp
    delete.bat

)

if "%CD%" NEQ "C:\tmp" (

    echo "not in temp"
    mkdir C:\tmp
    copy launch.bat C:\tmp\launch.bat
    echo "launch copied"
    C:
    cd \tmp
    cmd /c launch.bat

)

echo "launch end"

如果复制的执行与初始执行分开,则启动launch.bat将起作用。launch.bat

有没有人知道一种方法来.bat结束它的执行,即使它在执行时被删除?

4

5 回答 5

3

这将命令脚本删除自身然后退出。命令解释器在执行该行之前读取整行,因此即使文件不再存在,也会在删除命令之后执行退出命令。

del /f/q "%~0" | exit

或者,如果要在删除文件后执行许多命令,则可以使用括号,因为命令解释器会在执行之前读取括号内的所有内容。

(del /f/q "%~0"
if exist "%~0" (echo.How did that happen?) else (echo.I've deleted myself.)
pause
exit)   
于 2013-04-29T21:45:16.833 回答
1

可以从已删除的文件中执行行,但这些行必须驻留在括号块中,因为块在执行之前总是完全缓存到内存中。

显然您不能在批处理中调用函数,但可以调用其他批处理文件并将控制权取回(进入块中)。

@echo off
(
  echo Delete myself
  del %~f0
  call ..\second.bat 
  echo do some other stuff after second.bat
)
echo This line can't be reached anymore
于 2013-04-29T22:29:28.273 回答
0

有谁知道使 .bat 最终执行的方法,即使它在执行时被删除?

我不认为这是可能的。批量执行直接从文件中读取。如果你修改文件,它会改变执行(自修改批处理程序非常难以调试!)

为什么不从不同的位置启动批处理文件?

即使你不能这样做,你可以做的是让一个文件只包含一行,调用另一个不会被删除的批处理文件。这个文件做所有事情——启动java程序,做所有的清理工作,甚至包括恢复原始的批处理文件,这样你就可以多次运行它。

于 2009-11-30T17:09:46.940 回答
0

而不是通过 a 运行 launch.bat cmd /c launch.bat,它会在完成后尝试将控制权转移回调用批处理文件,只需执行以下操作即可运行它:launch.bat 这会将控制权(将其视为 goto 而不是调用)转移到批处理文件,因此它不会尝试将控制权返回给不再存在的文件。

于 2009-11-30T17:13:32.423 回答
0

通过这样做(launch.bat用调用cmd /k),我似乎有更好的结果:

启动.bat

echo "launch start"

setlocal enabledelayedexpansion enableextensions 

if "%CD%"=="C:\tmp" (

        echo "in temp"
        d:
        cd \tmp
        delete.bat
        echo "after delete"
)

if "%CD%" NEQ "C:\tmp" (

        echo "not in temp"
        mkdir C:\tmp
        copy launch.bat C:\tmp\launch.bat
        echo "launch copied"
        C:
        cd \tmp
        cmd /k launch.bat

)

echo "launch end"

现在我可以到达echo "after delete",但我最终以某种方式陷入了无限循环。至少我的清理工作可以在这一点上执行。不知道为什么我不能到达 echo "launch end",虽然。

于 2009-11-30T17:56:43.423 回答