首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理脚本删除本身

问批处理脚本删除本身
EN

Stack Overflow用户
提问于 2009-11-30 17:01:20
回答 5查看 6.1K关注 0票数 0

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

问题是,一旦删除了.bat文件,它就会在没有完成的情况下立即停止执行。但是在java程序退出后还有一些清理任务要完成。

我试图将.bat文件复制到其他地方,并在一个不被删除的位置启动它。唉,一旦删除了原始的.bat,因为它仍然在执行中,同样的崩溃就会发生,而且不会结束。

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

delete.bat

代码语言:javascript
复制
echo "delete start"

pause

del launch.bat

pause

echo "delete end"

launch.bat

代码语言:javascript
复制
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分开,那么启动launch.bat就可以工作。

有人知道如何使.bat在执行过程中被删除也能结束它的执行吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-30 17:56:43

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

launch.bat

代码语言:javascript
复制
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"。

票数 0
EN

Stack Overflow用户

发布于 2013-04-29 21:45:16

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

代码语言:javascript
复制
del /f/q "%~0" | exit

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

代码语言:javascript
复制
(del /f/q "%~0"
if exist "%~0" (echo.How did that happen?) else (echo.I've deleted myself.)
pause
exit)   
票数 3
EN

Stack Overflow用户

发布于 2013-04-29 22:29:28

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

显然,您不能在批处理中调用函数,但是可以调用其他批处理文件并将控件返回到块中。

代码语言:javascript
复制
@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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1821061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档