سيناريو دفعة حذف نفسه
-
10-07-2019 - |
سؤال
لدي .bat
سيناريو إطلاق java
البرنامج.على java
برنامج حذف المجلد حيث .bat
يجلس.ليس لدي أي وسيلة اتصال java
البرنامج.أنا فقط يمكن تعديل .bat
الملف.
المشكلة هي أن .bat
الملف بمجرد حذف يتوقف تنفيذه على الفور دون الانتهاء.ولكن هناك بعض المهام تنظيف القيام به بعد java
إنهاء البرنامج.
حاولت نسخ .bat
الملف في مكان آخر وإطلاقه في مكان حيث لن يتم حذفها.للأسف مرة الأصلي .bat
حذف لأنه لا يزال في التنفيذ ، نفس تحطم يحدث وأنه لا ينتهي.
هنا نوعان من ملفات العينة (لغرض المثال ، دعنا ندعي أنها تقع في D:\tmp
) :
حذف.الخفافيش
echo "delete start"
pause
del launch.bat
pause
echo "delete end"
إطلاق.الخفافيش
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
ينتهي تنفيذه حتى إذا تم حذفه في حين أنه ينفذ?
المحلول 4
يبدو علي نتيجة أفضل من يفعل ذلك مثل هذه (الدعوة launch.bat
مع cmd /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"
, ، على الرغم من.
نصائح أخرى
وهذا الأمر السيناريو إلى حذف نفسه ثم الخروج.خط كامل للقراءة من قبل مترجم الأوامر قبل خط يتم تنفيذ ذلك الأمر 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)
لا أحد يعرف طريقة لجعل .بات ينتهي تنفيذه حتى إذا تم حذفه في حين أنه ينفذ ?
أنا لا أعتقد أنه من الممكن.دفعة التنفيذ قراءة مباشرة من الملف.إذا قمت بتعديل ملف, فإنه سيتم تغيير التنفيذ (الذاتي تعديل دفعة برامج رائعة من الصعب التصحيح!)
لماذا لا تبدأ الملف الدفعي من مكان مختلف ؟
حتى إذا كنت لا تستطيع أن تفعل ذلك ، ما يمكنك القيام به هو أن يكون الملف يتكون من خط واحد فقط ، داعيا آخر ملف دفعي التي لا تحصل على حذفها.هذا الملف يفعل كل شيء - بدءا من برنامج جافا, تفعل كل تنظيف ، وحتى بما في ذلك استعادة الأصلي ملف دفعي بحيث يمكنك تشغيله عدة مرات.
بدلا من تشغيل الاطلاق.الخفافيش عن طريق cmd /c launch.bat
, والتي سوف محاولة نقل التحكم إلى استدعاء ملف دفعي عندما يتم تشغيلها ببساطة عن طريق القيام: launch.bat
سيتم نقل هذا التحكم (كما أنها تفكر في الانتقال بدلا من دعوة) إلى ملف دفعي ، لذلك لن محاولة إعادة التحكم إلى ملف لم يعد موجودا.
فمن الممكن لتنفيذ خطوط من حذف الملف ولكن الخطوط يجب أن تتواجد في قوسين كتلة ، كتل دائما مؤقتا كلي في الذاكرة قبل أن يتم تنفيذها.
من الواضح أنه لا يمكنك استدعاء وظائف في الدفعة, ولكن من الممكن أن ندعو غيرها من الملفات الدفعية والحصول على السيطرة مرة أخرى (في المنطقة).
@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