Irgendwann in meinem Skript möchte ich, dass sich das Fledermaus-Skript selbst löscht. Dies erfordert, dass das Skript seinen Namen kennt und dann diesen Namen verwendet, um sich selbst zu löschen. Ist das möglich?Kennt eine Fledermaus-Datei ihren Namen und kann sie sich löschen
Antwort
Wenn ich mich nicht irre, ist% 0 der Pfad zum Aufruf der Batch-Datei.
Geprüft und Arbeiten:
del %0
exit
Es könnte besser so gemacht werden: 'del"% ~ f0 "& exit/b'. "% ~ f0" sorgt dafür, dass die Stapeldatei aus einem anderen Verzeichnis und aus Leerzeichen im Pfad ausgeführt wird. Das Einfügen beider Befehle in eine einzige Zeile vermeidet den Fehler "Datei nicht gefunden", der manchmal in der ursprünglichen Form auftreten kann, wenn die Zeile, die 'exit' enthält, nicht gepuffert wird, bevor' del' ausgeführt wird. Schließlich beendet '/ b' nur die Batch-Datei, anstatt die gesamte Konsole zu schließen. – atzz
@atzzz - aber "exit/b" anstelle von "exit" führt zu einem hässlichen "Die Batch-Datei kann nicht gefunden werden." Fehlermeldung. – dbenham
@dbenham - Sie haben Recht. (Interessanterweise kann ich mich nicht daran erinnern, diese Nachricht schon einmal erhalten zu haben; hat sich das Verhalten in den dazwischenliegenden Jahren geändert? Oder ist es meine Erinnerung?) Aber in meinem Buch ist es viel besser, als die Konsole direkt zu schließen. – atzz
% 0 gibt Ihnen den relativen Pfad der aus dem Verzeichnis, in dem die bat-Datei gestartet wurde. Also, wenn Sie es nennen
mybats\delyourself.bat tango roger
% 0 enthält mybats\delyourself.bat
del %0
funktioniert, wenn Sie nicht Ihr aktuelles Verzeichnis geändert haben.
%~f0
exportiert den vollständigen Pfad zur Datei.
Es besteht keine Notwendigkeit für 'SET path_to_bat =% ~ f0', da '% ~ f0' immer *** den vollständigen Pfad zum aktuell laufenden Batch-Skript angibt, auch wenn es in aufgerufenen Unterprogrammen oder bei CD oder PUSHD verwendet wird wurde seit dem Start ausgeführt. – dbenham
oh natürlich! repariere es, weiß nicht warum ich dachte, dass es nötig wäre. Ich habe die Antwort aktualisiert. – peterchen
Keine der vorhandenen Antworten bietet eine saubere Möglichkeit für eine Batchdatei, sich selbst zu löschen und ohne sichtbare Fehlermeldung zu beenden.
Einfach einschließlich del "%~f0"
löscht das Skript, aber es ergibt auch eine hässliche "Die Batch-Datei kann nicht gefunden werden." Fehlermeldung.
Wenn es OK für das Skript den Eltern CMD-Prozess (das Konsolenfenster) zu schließen, dann funktioniert das folgende ohne Fehlermeldung fein:
del "%~f0"&exit
Aber es ist ein wenig komplizierter, wenn Sie wollen das Skript, um sich selbst zu löschen und ohne zu beenden, den übergeordneten CMD-Prozess zu schließen, und ohne jede Fehlermeldung.
Methode 1: Starten Sie einen zweiten Prozess, der innerhalb desselben Konsolenfensters ausgeführt wird, das das Löschen tatsächlich ausführt. Die EXIT /B
ist wahrscheinlich nicht notwendig, aber ich habe es eingefügt, um die Wahrscheinlichkeit zu maximieren, dass das Batch-Skript geschlossen wird, bevor der gestartete Prozess versucht, die Datei zu löschen.
start /b "" cmd /c del "%~f0"&exit /b
Methode 2: Erstellen und Steuerung auf eine andere temporäre Batch-Datei übertragen, die selbst als auch der Anrufer löscht, aber nicht verwenden Anruf, und leiten stderr zu nul.
>"%~f0.bat" echo del "%~f0" "%~f0.bat"
2>nul "%~f0.bat"
Für mich war es wichtig, dass ich keine Errorlevel 1, nachdem ich die Batch-Datei beendet haben. Ich fand eine passende und einfache Antwort auf diese Weise: DeleteMyself.cmd:
START CMD /C DEL DeleteMyself.cmd
Testansatz, wenn DeleteMyself.cmd Rückkehr wird Errorlevel 0 TestDeleteMyself.cmd:
call DeleteMyself.cmd
echo Errorlevel: %errorLevel%
- 1. Wie kann eine Funktion ihren Namen und Argumente in R
- 2. kann eine ActionScript-Funktion ihren eigenen Namen herausfinden?
- 3. Wie kann eine Anwendung eine DLL ohne ihren Namen laden?
- 4. Kann eine ColdFusion-cfc-Methode ihren eigenen Namen ermitteln?
- 5. Holen Sie sich Ihren Standort durch Python
- 6. Wie löschen Sie Ihren Anrufprotokollverlauf in Android?
- 7. Wie kennt Google den Namen meines Computers?
- 8. Zuweisen einer Fledermausdatei mit ConEmu
- 9. rufen Sie eine Lua-Funktion auf, indem Sie einfach ihren Namen schreiben (ohne Klammern)
- 10. Wie kennt Eclipse den Namen Ihres Projekts?
- 11. Git löschen Sie eine Datei mit Leerzeichen im Namen
- 12. Löschen Sie eine Datei mit dem Namen "NUL" unter Windows
- 13. Wie kann ich Git Zweige basierend auf ihren Namen färben?
- 14. So löschen Sie eine Datei/ein Verzeichnis mit '$' im Namen
- 15. Wie kennt meine Ansicht ihren Presenter ohne DataContext?
- 16. Können Sie eine PHP-Funktion rekursiv machen, ohne ihren Namen zu wiederholen?
- 17. Wie löschen Sie Ihren Cache in Laravel vollständig?
- 18. Namen eine Funktion „Löschen“ ... Löschen ist ein reserviertes Wort
- 19. Wie erinnern sich Banken an "Ihren Computer"?
- 20. Kann eine Richtlinie löschen sich aus einem übergeordneten Bereich
- 21. Wie öffne ich eine temporäre Datei und bekomme ihren Dateinamen?
- 22. Eingangsvariable in Makefile lesen und Variable auf ihren Namen setzen
- 23. Kann eine Windows-DLL ihren eigenen Dateinamen abrufen?
- 24. Wie unterscheiden sich Ruby und PHP in ihren Evaluierungs-Engines?
- 25. PHP: Holen Sie sich den Browser-Namen
- 26. Wie kann man eine Methode aufrufen, ohne ihren Namen in C# zu kennen?
- 27. Spielzentrum. Holen Sie sich echten Namen
- 28. Holen Sie sich echten Namen in Magento
- 29. Wie erhalten Sie Remote-Ordner-Namen, wählen Sie sie aus und löschen Sie sie in C#?
- 30. Wie kann man temporäre Dateien verschieben, wenn man nur ihren Pfad kennt?
Ich bin Was passiert, wenn eine Batch-Datei (oder irgendein anderes Programm) eine andere Batch-Datei aufruft ... was '% 0' in der zweiten Batch-Datei? – st0le
Ich würde das versuchen müssen, aber meine Vermutung wäre, dass es der Pfad ist, der in der Aufrufer-Batch-Datei bereitgestellt wird. – JoshD
Nein, es ist die aktuelle Stapeldatei. – ubiquibacon