2009-11-30 50 views
0

我有一個.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會工作if複製的launch.bat的執行與最初的一個分開。

有誰知道一種方法,使一.bat結束了它的執行,即使當它執行它被刪除?

回答

0

看來我有做這樣的(呼叫launch.batcmd /k)更好的結果:

推出。蝙蝠

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

有沒有人知道一種方法來使一個.bat結束它的執行,即使它在執行時被刪除?

我不認爲這是可能的。批量執行直接從文件中讀取。如果修改了文件,它會改變執行(自我修改的批處理程序是極其困難的調試!)

你爲什麼不只是從不同的位置開始您的批處理文件?

即使你不能做到這一點,你可以做的是有隻由一條線的文件,要求不被刪除另一個批處理文件。這個文件完成了一切 - 啓動java程序,完成所有清理工作,甚至還包括恢復原始批處理文件,以便可以多次運行它。

+0

不幸的是在其他地方添加另一個文件在這種情況下不是一個選項。我只能訪問正在被刪除的文件夾,所以我會創建另一個文件來達到同樣的崩潰。 – glmxndr 2009-11-30 17:14:34

+0

也許你可以在Word中打開批處理文件(或使用其他一些機制)來強制對文件進行排它鎖定,然後當Java程序試圖刪除它時,刪除操作將失敗。 – 2009-11-30 19:23:04

+0

有趣的是,如果我將launch.bat設置爲只讀,它不能被delete.bat刪除,但我仍然永遠達不到'echo「啓動結束。 – glmxndr 2009-12-01 08:14:14

0

而是通過cmd /c launch.bat,這將嘗試通過簡單地做當它完成轉移回控制調用批處理文件,運行它運行launch.bat的:launch.bat 這將控制轉移(認爲它作爲一個goto,而不是的調用)到批處理文件,所以它不會嘗試將控制返回到不再存在的文件。

+0

在我目睹直接調用launch.bat導致同樣的問題後,我實際上添加了'cmd/c'。 – glmxndr 2009-11-30 17:15:49

+0

使用'cmd/k'調用稍好一些,因爲我可以看到回聲「刪除結束」,但仍然無法達到「啓動結束」。 – glmxndr 2009-11-30 17:19:02

+0

我在說的是launch.bat命令應該是批處理文件最後一件事,任何清理代碼都應該放入launch.bat。 – Ferruccio 2009-11-30 18:02:57

3

這將命令腳本刪除自身然後退出。在執行該行之前,命令解釋程序將讀取整行,以便在刪除命令後執行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) 
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