2010-05-22 43 views
25

如何讓.BAT文件在完成後自行刪除?我有一個簡單的bat文件終止一個進程。我想要.BAT文件自己刪除。如何使.BAT文件在完成後自行刪除?

+6

所以,你想一個批處理文件,不顯示任何窗口,殺死處理完成後自行刪除。只是出於好奇。爲什麼? – 2010-05-22 17:31:48

回答

31
@ECHO OFF 
SETLOCAL 

SET someOtherProgram=SomeOtherProgram.exe 
TASKKILL /IM "%someOtherProgram%" 

ECHO "This script will now self-destruct. Please ignore the next error message" 
DEL "%~f0" 

注意,DEL線最好是你打算裏面的批處理文件執行的最後一件事情,否則你的運氣了:)

這將打印出一個醜陋的錯誤消息,但它是良性的,而且這種方式的代碼稍微不那麼混亂。如果您非常關心擺脫錯誤消息,請參閱dbenham's answer以擺脫它。

+0

您能解釋這一點嗎? 什麼是someotherprogram.exe和你在裏面打什麼? – 2011-10-10 21:05:11

+0

@Richard:'SomeOtherProgram.exe'可以更改爲任何程序。例如'notepad.exe'。這是將被殺死的程序,並且該程序的作用並不重要 - 該批處理文件不關心。它只是使用'TaskKill'​​來殺死具有該exe名稱的任務。這是否清除它?如果是這樣,你認爲它需要添加到答案?如果沒有,請更詳細地解釋你理解哪些部分,哪些不理解。 – 2011-10-11 00:17:38

+2

謝謝你的回覆@Merlyn。我的錯,我沒有仔細閱讀這個問題。我想知道爲什麼你需要殺死一個進程來刪除一個蝙蝠本身。 :) – 2011-10-11 00:28:28

4

您沒有提到操作系統,但是如果這是在Windows XP Professional上並且您具有適當的權限,則可以讓批處理文件安排一次性Windows計劃任務以便稍後刪除該文件。使用schtasks命令,記錄爲here

否則,您通常無法刪除正在執行的文件,因爲這有可能造成各種不良情況。此外,試圖刪除正在使用的可執行文件被任何數量的防病毒程序視爲非常可疑的行爲,所以很可能您會遇到這些問題。

+2

實際上,有一個令人驚訝的簡單方法可以讓批處理文件自己刪除,而不會出現無需特殊權限的錯誤。請參閱[我的答案](http://stackoverflow.com/a/20333152/1012053) – dbenham 2013-12-06 15:26:52

1

就在您的批處理文件的最後一行添加此命令

Del batch_file_name.bat 

batch_file_name.bat是您的批處理文件的名稱

乾杯

+2

它不起作用。 – 2011-10-10 21:03:36

+0

* @ Ricardo Polo *不,它不會工作,因爲進程被鎖定,所以除非PID被釋放,否則文件不會被刪除。我實際上認爲這就是上面討論的內容,但是*哈尼魯丁*似乎錯過了這個! – CriticalPoint 2015-10-26 16:37:04

35

的Merlyn摩根 - 格雷厄姆回答設法刪除運行批處理腳本,但它會生成以下錯誤消息:「批處理文件找不到」這不是ap如果控制檯窗口在腳本終止時關閉,則會出現問題,因爲消息會以非常快的速度閃爍以至於沒有人會看到它。但是如果控制檯在腳本終止後仍保持打開狀態,則錯誤消息是非常不可取的。

John Faminella有一個正確的想法,即需要另一個進程清理刪除批處理文件,而不會出錯。安排任務可以工作,但有一個更簡單的方法:使用START在同一控制檯內啓動新的刪除進程。進程啓動和執行需要時間,所以父腳本有機會在刪除發生之前乾淨地終止。

start /b "" cmd /c del "%~f0"&exit /b 

更新2015-07-17

我發現了另一個真正漂亮的辦法有一個批處理腳本刪除自身,而不會產生任何錯誤消息。該技術在http://www.dostips.com/forum/viewtopic.php?f=3&t=6491

取決於GOTO(某些俄羅斯人發現),在英語中描述的一個新發現的行爲綜上所述,(GOTO) 2>NUL行爲就像EXIT /B,但它允許在調用者的情況下級聯命令的執行!

因此,所有你需要的是

(goto) 2>nul & del "%~f0" 
+1

我喜歡你的第二個解決方案。第一個很可能會工作得很好,但我不確定如果'start'在當前的批處理腳本解釋器完成之前設法完成它的工作,那麼它是不能保證工作的。我假設如果進程調度程序運行正常或者系統沒有負載過重,任何競爭條件都不太可能成爲問題,所以它可能只是一個挑剔的問題。 – 2016-07-31 05:49:37

+0

(和「保證工作」,我的意思是保證避免錯誤信息) – 2016-07-31 05:57:20

+0

@ MerlynMorgan-Graham - 絕對是一個競爭條件,所以你在技術上是正確的。但是我很難想象一個時機倒轉的情景。這可能是一個有趣的項目,試圖設計一個失敗 – dbenham 2016-07-31 11:53:23

0

你可以做@ Merlyn的aswer

@ECHO OFF 
SETLOCAL 
SET someOtherProgram=SomeOtherProgram.exe 
TASKKILL /IM "%someOtherProgram%" 
DEL "%~f0" 

現在做一個VBScript與此編碼並將其保存爲hidden.vbs,這VBScript中會隱藏批次文件的窗口。

set w = CreateObject(「WScript.Shell」) 
W.Run chr(34) & 「%userprofile%\desktop\the_batch_file.bat」 & chr(34), 0 
set w= Nothing 

然後讓批處理文件運行此VBScript中

@ECHO OFF 
SETLOCAL 
SET someOtherProgram=SomeOtherProgram.exe 
TASKKILL /IM "%someOtherProgram%" 
start "path to hidden.vbs" 
DEL "%~f0" 

這將隱藏批處理文件刪除它使得錯誤信息不可能看到了。

0

你也可以直接的DEL「%〜F0」輸出爲NULL,像這樣的輸出...

@ECHO OFF 
SETLOCAL 
SET someOtherProgram=SomeOtherProgram.exe 
TASKKILL /IM "%someOtherProgram%" 
DEL "%~f0" > NUL 
+2

對不起,但討論的錯誤信息不是來自'del',而是因爲解釋器試圖從現在刪除的文件中讀取「下一個命令」。你的建議不會壓制這一點。 – Stephan 2017-03-29 15:14:48

+0

我以這種方式運行時沒有收到任何錯誤消息,但沒有收到它。 – 2017-03-29 16:08:32

+2

對我來說,它是完全一樣的,有或沒有'> nul'。正如我所說:錯誤不是來自'del',因此重定向del的輸出將無濟於事(除此之外:爲了抑制錯誤,您必須重定向STDERR:'2> nul' - 也沒有幫助。) – Stephan 2017-03-29 16:15:35

相關問題