2010-05-22 14 views
25

कैसे बनाना है। बीएटी फ़ाइल इसे पूरा करने के बाद स्वयं को हटा दें? मेरे पास एक साधारण बल्ले फ़ाइल है जो एक प्रक्रिया को समाप्त करती है। मैं चाहता हूं कि बीएटी फाइल खुद को हटाने के लिए।कैसे बनाया जाए। बीएटी फ़ाइल इसे पूरा करने के बाद स्वयं को हटा दें?

+6

तो तुम एक बैच फ़ाइल है कि किसी भी विंडोज़ प्रदर्शित नहीं करता है चाहते हैं, को मारता है एक पूरा होने के बाद खुद को संसाधित और हटा देता है। जिज्ञासा के कारण। क्यूं कर? –

उत्तर

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" 

ध्यान दें कि डेल लाइन बेहतर आखिरी बात आप बैच फ़ाइल के अंदर निष्पादित करने का इरादा हो, अन्यथा आप भाग्य :) से बाहर हो

यह बाहर प्रिंट होगा एक बदसूरत त्रुटि संदेश है, लेकिन यह सौम्य है, और कोड इस तरह से थोड़ा उलझन में है। यदि आपको त्रुटि संदेश से छुटकारा पाने के बारे में बहुत कुछ परवाह है, तो इसे छुटकारा पाने के लिए dbenham's answer देखें।

+0

क्या आप इसे थोड़ा सा बता सकते हैं? someotherprogram.exe क्या है और आप इसके अंदर क्या पंट करते हैं? –

+0

@ रिचर्ड: 'SomeOtherProgram.exe' को किसी भी प्रोग्राम के रूप में बदला जा सकता है। उदाहरण के लिए, 'notepad.exe'। यह वह कार्यक्रम है जिसे मारा जाएगा, और इससे कोई फ़र्क नहीं पड़ता कि वह प्रोग्राम क्या करता है - इस बैच फ़ाइल परवाह नहीं है। यह उस exe नाम के साथ एक कार्य को मारने के लिए बस 'टास्ककिल' का उपयोग करता है। क्या यह इसे साफ़ करता है? यदि हां, तो क्या आपको लगता है कि इसे उत्तर में जोड़ा जाना चाहिए? यदि नहीं, तो कृपया अधिक विस्तार से बताएं कि आप किन भागों को समझते हैं, और जो आप नहीं करते हैं। –

+2

उत्तर @Merlyn के लिए धन्यवाद। मेरी गलती, मैंने सवाल अच्छी तरह से नहीं पढ़ा। मैं यह महसूस कर रहा था कि आपको बल्ले को हटाने के लिए एक प्रक्रिया को मारने की आवश्यकता क्यों है। :) –

4

आपने ओएस का उल्लेख नहीं किया है, लेकिन यदि यह विंडोज एक्सपी प्रोफेशनल पर है और आपके पास उचित अनुमतियां हैं, तो आप बैच फ़ाइल शेड्यूल को बाद में फ़ाइल को हटाने के लिए एक-शॉट विंडोज अनुसूचित कार्य शेड्यूल कर सकते हैं। schtasks कमांड का उपयोग करें, here दस्तावेज।

अन्यथा, आप आम तौर पर निष्पादित की जा रही फ़ाइल को हटा नहीं सकते हैं, क्योंकि इसमें सभी तरह के नास्टनेस की संभावना है। इसके अतिरिक्त, उपयोग में निष्पादन योग्य को हटाने का प्रयास किसी भी एंटीवायरस प्रोग्राम द्वारा बहुत ही संदिग्ध व्यवहार के रूप में देखा जाता है, इसलिए यह संभावना है कि आप इन्हें भी आगे बढ़ाएंगे।

+2

असल में, एक बैच फ़ाइल को बिना किसी त्रुटि के खुद को हटाने के लिए एक आश्चर्यजनक सरल तरीका है जिसे विशेष अनुमतियों की आवश्यकता नहीं होती है। [मेरा जवाब] देखें (http://stackoverflow.com/a/20333152/1012053) – dbenham

1

बस अपने बैच फ़ाइल की अंतिम पंक्ति में इस आदेश को जोड़ने

Del batch_file_name.bat 

batch_file_name.bat अपने बैच फ़ाइल का नाम

चीयर्स

+2

के साथ बदलकर यह काम नहीं करता है। –

+0

* @ रिकार्डो पोलो * नहीं, यह काम नहीं करेगा क्योंकि प्रक्रिया लॉक है, इसलिए जब तक कि पीआईडी ​​जारी नहीं किया जाता है तो फ़ाइल हटा नहीं जाएगी। मैंने वास्तव में सोचा कि ऊपर चर्चा की जा रही है, लेकिन * @ हानी लुडिन * यह याद आती है! – CriticalPoint

35

Merlyn मॉर्गन-ग्राहम जवाब को नष्ट करने का प्रबंध करती है बैच स्क्रिप्ट चल रहा है, लेकिन यह निम्न त्रुटि संदेश उत्पन्न करता है: "बैच फ़ाइल नहीं मिल सकती है।" यह एपी नहीं है अगर स्क्रिप्ट विंडो समाप्त हो जाती है तो कंसोल विंडो बंद हो जाती है, क्योंकि संदेश इतनी तेजी से फ्लैश होगा कि कोई भी इसे देख नहीं पाएगा। लेकिन स्क्रिप्ट समाप्ति के बाद कंसोल खुला रहता है तो त्रुटि संदेश बहुत अवांछनीय है।

जॉन फेमिनेला का सही विचार है कि त्रुटि के बिना बैच फ़ाइल को साफ़ करने के लिए एक और प्रक्रिया की आवश्यकता है। किसी कार्य को शेड्यूल करना काम कर सकता है, लेकिन एक आसान तरीका है: एक ही कंसोल के भीतर एक नई डिलीट प्रक्रिया लॉन्च करने के लिए स्टार्ट का उपयोग करें। प्रक्रिया को शुरू करने और निष्पादित करने में समय लगता है, इसलिए अभिभावक स्क्रिप्ट को हटाने से पहले साफ-सफाई समाप्त करने का मौका होता है।

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

अद्यतन 2015-07-16

मैं एक बैच स्क्रिप्ट किसी भी त्रुटि संदेश उत्पन्न किए बिना ही हटाना है करने के लिए एक और वास्तव में चालाक तरीका ढूंढ निकाला है। तकनीक, EXIT /B तरह http://www.dostips.com/forum/viewtopic.php?f=3&t=6491

पर गोटो (कुछ रूसियों द्वारा की खोज), अंग्रेजी में वर्णित की एक नई खोज की व्यवहार पर निर्भर करता है सारांश में, (GOTO) 2>NUL बर्ताव को छोड़कर यह फोन करने वाले के संदर्भ में श्रेणीबद्ध आदेशों के निष्पादन के लिए अनुमति देता है!

तो आप सभी की जरूरत है

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

मुझे आपका दूसरा समाधान पसंद है। पहली बार बहुत अच्छी तरह से काम करेगा, लेकिन मुझे यकीन नहीं है कि मौजूदा बैच स्क्रिप्ट दुभाषिया खत्म होने से पहले 'स्टार्ट' अपना काम पूरा करने का प्रबंधन करता है, तो यह काम करने की सख्ती से गारंटी है। मुझे लगता है कि प्रक्रिया शेड्यूलर काम कर रहा है या सिस्टम भारी भार के तहत नहीं है, तो शायद किसी भी दौड़ की स्थिति एक समस्या होने की संभावना नहीं है, तो शायद यह सिर्फ एक नाइट-पिक है। –

+0

(और "काम करने की गारंटी" से, मेरा मतलब है त्रुटि संदेश से बचने के लिए गारंटी) –

+0

@ MerlynMorgan-ग्राहम - बिल्कुल यह एक दौड़ की स्थिति है, इसलिए आप तकनीकी रूप से सही हैं। लेकिन मेरे लिए एक परिदृश्य की कल्पना करना मुश्किल है जहां समय उलटा हुआ है। – dbenham

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

तुम भी डेल "% ~ f0" के उत्पादन में निर्देशन कर सकें शून्य पर तो जैसे उत्पादन ...

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

विफलता को इंजीनियर करने का प्रयास करने के लिए यह एक दिलचस्प प्रोजेक्ट हो सकता है, लेकिन चर्चा की गई त्रुटि संदेश 'del' से नहीं आती है, लेकिन क्योंकि दुभाषिया अब हटाए गए फ़ाइल से "अगला आदेश" पढ़ने की कोशिश करता है। आपका सुझाव उस पर दबाने नहीं देता है। – Stephan

+0

जब मैंने इसे इस तरह से चलाया तो मुझे कोई त्रुटि संदेश नहीं मिला, लेकिन इसके बिना किया। –

+2

मेरे लिए यह बिल्कुल वही है, बिना 'nul' के या बिना।जैसा कि मैंने कहा था: त्रुटि 'del' से नहीं आती है, इसलिए 'del' के आउटपुट को रीडायरेक्ट करने में मदद नहीं होगी (इसके अलावा: ERRORS को दबाने के लिए, आपको STDERR को पुनर्निर्देशित करना होगा:' 2> nul' - जो ' टी या तो मदद करें।) – Stephan

संबंधित मुद्दे