题
我有一个.bat
脚本发动java
程序。
该D:\tmp
程序删除其中launch.bat
坐的文件夹。
我也没有办法接触到<=>程序。我只可以修改<=>文件。
在的问题是,<=>文件,一旦被删除,停止其执行权远没有完成。 但也有一些清理任务到<=>程序退出之后进行。
我试图复制<=>文件别的地方,在那里它不会被删除的位置启动它。可惜的是,一旦原来<=>被删除,因为它仍然在执行,同样的崩溃发生,并没有完成。
下面是两个示例文件(用于示例的目的,让我们假设它们存在于<=>):
<强> 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"
启动<=>会工作,如果执行复制<=>从最初一个分离。
有谁知道一种方法,使一<=>结束了它的执行,即使当它执行它被删除?
解决方案 4
看来我有一个更好的结果通过做这样的(呼叫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"
,虽然。
其他提示
这将命令脚本删除本身然后退出。整行是由命令解释程序读取之前执行行,以便退出命令将即使文件不再存在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)
有谁知道一种方法,使一个.BAT结束了它的执行,即使当它执行它被删除?
我不认为这是可能的。批处理执行直接从文件中读取。如果修改了文件,它会改变执行(自我修改的批处理程序是极其困难的调试!)
你为什么不只是从不同的位置开始您的批处理文件?
即使你不能做到这一点,你可以做的是有只由一条线的文件,要求不被删除另一个批处理文件。这个文件做一切 - 启动java程序,做所有的清理,甚至包括恢复原来的批处理文件,这样就可以多次运行它
而不是通过cmd /c launch.bat
,它会尝试当它完成转移回控制调用批处理文件,通过简单地做运行它运行launch.bat的:launch.bat
这将控制(认为它作为一个goto,而不是呼叫)转移到批处理文件,所以它不会试图控制返回到不再存在的文件。
有可能从已删除的文件执行线,但是在线路必须驻留在括号块,如在执行它们之前块总是完全地高速缓存到存储器中。
显然,你不能调用函数在批处理,但它是可以调用其他批处理文件并获得控制权交还给(成块)。
@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