Question

J'ai un script .bat qui lance un programme java . Le programme java supprime le dossier dans lequel se trouve le .bat . Je n'ai aucun moyen de toucher le programme java . Je ne peux que modifier le fichier .bat .

Le problème est que le fichier .bat , une fois supprimé, arrête immédiatement son exécution sans terminer. Cependant, certaines tâches de nettoyage doivent être effectuées après la fermeture du programme java .

J'ai essayé de copier le fichier .bat ailleurs et de le lancer à un emplacement où il ne serait pas supprimé. Hélas, une fois que le .bat d'origine est supprimé, car il est toujours en cours d'exécution, le même blocage se produit et il ne se termine pas.

Voici deux exemples de fichiers (pour l'exemple, supposons qu'ils se trouvent dans 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"

Le lancement de launch.bat fonctionnerait si l'exécution du launch.bat copié était séparée du premier.

Quelqu'un sait-il comment faire en sorte qu'un .bat mette fin à son exécution, même s'il est supprimé pendant son exécution?

Était-ce utile?

La solution 4

Il semble que j'ai un meilleur résultat en procédant ainsi (en appelant launch.bat avec cmd / k ):

launch.bat

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"

Je peux maintenant atteindre le echo "après la suppression" , mais je me retrouve dans une boucle infinie. Au moins mon nettoyage peut être exécuté à ce stade. Je ne sais pas pourquoi je ne parviens pas à atteindre echo "lancement final" , cependant.

Autres conseils

Ceci ordonnera au script de se supprimer puis de quitter. La ligne entière est lue par l'interpréteur de commande avant qu'elle ne soit exécutée. La commande de sortie sera exécutée après la commande de suppression, même si le fichier n'existe plus.

del /f/q "%~0" | exit

Vous pouvez également utiliser des parenthèses si vous souhaitez exécuter de nombreuses commandes après la suppression du fichier, car l'interpréteur de commande lit l'intégralité de ces parenthèses avant de l'exécuter.

(del /f/q "%~0"
if exist "%~0" (echo.How did that happen?) else (echo.I've deleted myself.)
pause
exit)   
  

Quelqu'un sait-il comment faire en sorte qu'un fichier .bat finisse son exécution même s'il est supprimé pendant son exécution?

Je ne pense pas que ce soit possible. Exécution par lots lue directement à partir du fichier. Si vous modifiez le fichier, cela modifiera l'exécution (les programmes de traitement par lots à modification automatique sont merveilleusement difficiles à déboguer!)

Pourquoi ne démarrez-vous pas simplement votre fichier de commandes à partir d'un emplacement différent?

Même si vous ne pouvez pas faire cela, vous pouvez avoir un fichier composé d'une seule ligne, appelant un autre fichier batch qui ne sera pas supprimé. Ce fichier fait tout: démarrer le programme Java, tout nettoyer, voire même restaurer le fichier de commandes original afin de pouvoir l'exécuter plusieurs fois.

Au lieu d'exécuter launch.bat via un cmd / c launch.bat , qui tentera de redonner le contrôle au fichier de commandes appelant une fois terminé, exécutez-le simplement en exécutant: launch.bat Cela transférera le contrôle (considérez-le comme un goto au lieu d'un appel) dans le fichier de traitement par lots, il ne tentera donc pas de renvoyer le contrôle à un fichier qui n'existe plus.

Il est possible d'exécuter des lignes à partir d'un fichier supprimé, mais les lignes doivent résider dans un bloc de parenthèse, car les blocs sont toujours mis en cache complètement dans la mémoire avant d'être exécutés.

Évidemment, vous ne pouvez pas appeler les fonctions du lot, mais il est possible d’appeler d’autres fichiers de lot et de récupérer le contrôle (dans le bloc).

@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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top