我有一个.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}}最终执行?
答案 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