我有一个.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分开,那么启动launch.bat就可以工作。
有人知道如何使.bat在执行过程中被删除也能结束它的执行吗?
发布于 2009-11-30 17:56:43
通过这样做(用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"。
发布于 2013-04-29 21:45:16
这将命令脚本删除自身,然后退出。整个行在执行行之前由命令解释器读取,因此即使文件不再存在,退出命令也将在delete命令之后执行。
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-29 22:29:28
从已删除的文件中执行行是可能的,但是行必须驻留在括号块中,因为块在执行之前总是完全缓存到内存中。
显然,您不能在批处理中调用函数,但是可以调用其他批处理文件并将控件返回到块中。
@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 anymorehttps://stackoverflow.com/questions/1821061
复制相似问题