سؤال

لدي .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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top