批量脚本删除自身

时间:2009-11-30 17:01:21

标签: batch-file delete-file

我有一个.bat脚本启动java程序。 java程序会删除.bat所在的文件夹。 我无法触及java计划。我只能修改.bat文件。

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

我尝试将.bat文件复制到其他位置,然后在不会被删除的位置启动它。唉,一旦原来的.bat被删除,因为它仍然处于执行状态,同样的崩溃就会发生,而且还没有完成。

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

delete.bat

echo "delete start"

pause

del launch.bat

pause

echo "delete end"

launch.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将起作用。

是否有人知道如果{{1}}在执行时被删除,会使{{1}}最终执行?

5 个答案:

答案 0 :(得分:3)

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

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)   

答案 1 :(得分:0)

  

有人知道一种方法可以使.bat在执行时被删除吗?

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

为什么不从其他位置启动批处理文件?

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

<强> launch.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"

答案 4 :(得分:0)

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

显然,您无法在批处理中调用函数,但可以调用其他批处理文件并将控制权恢复(进入块)。

@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