Eingabeaufforderung Laufwerksbuchstabe

497
Pedro Velez

Ich habe an diesem einfachen Stapel in Windows 7 gearbeitet. Er hat einen Laufwerksbuchstaben, um alle darin enthaltenen Dateien und Ordner zu löschen. Wenn das Laufwerk nicht bereitgestellt wurde, sollte es den Benutzer zur Eingabe eines Laufwerks auffordern, hier:

@echo off  set folder="t:\"  IF EXIST "%folder%" (  cd /d %folder% for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)  )ELSE (@echo this drive is not mounted, please enter a new one.  set /p drive=  cd /d %drive% for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q) @pause) 

Das IF EXISTTeil funktioniert einwandfrei, aber wenn das Laufwerk nicht bereitgestellt ist, funktioniert es nicht, wenn Sie einen neuen Laufwerksbuchstaben eingegeben haben. Irgendwelche Ideen? Danke im Voraus.

1
Sie sagen "Laufwerk" aber dann im Code "Ordner". Wie kann ein Ordner gemountet werden? Wenn Sie wirklich alle Dateien und Ordner auf einem Laufwerk löschen möchten, warum formatieren Sie sie nicht einfach? Wenn Sie einen Ordner und seine Dateien und Unterverzeichnisse löschen möchten, verwenden Sie Dinge wie `deltree` phuclv vor 7 Jahren 0
Es sagt Ordner, dann heißt es Laufwerk im anderen Teil. Soweit es mich betrifft, können Variablen jeden beliebigen Namen annehmen. Ich könnte jedoch falsch sein. Pedro Velez vor 7 Jahren 0
Was auch immer Sie tun möchten, Sie haben es falsch gemacht. Das Entfernen von Dateien und Ordnern nacheinander ist im Vergleich zu einem einzigen "Deltree" äußerst kostspielig phuclv vor 7 Jahren 0
Meine Frage besagt, dass nach der Eingabe des Laufwerksbuchstabens der Benutzer nicht funktioniert. Daher konzentrieren Sie sich auf etwas, das irrelevant ist. Es sind Laufwerke und keine Methoden, die hier von Bedeutung sind. Pedro Velez vor 7 Jahren 0
Sie können Partitionen in Ordner einbinden, seitdem Sie 2k gewinnen Canadian Luke vor 7 Jahren 0

1 Antwort auf die Frage

1
DavidPostill

Wenn das Laufwerk nicht bereitgestellt ist, funktioniert es nicht, wenn Sie einen neuen Laufwerksbuchstaben eingegeben haben

Sie müssen enabledelayedexpansion:

Hinzufügen

setlocal enabledelayedexpansion 

an den Anfang Ihrer Batchdatei und ersetzen Sie %drive%mit!drive!

Korrigierte Batchdatei:

@echo off  setlocal enabledelayedexpansion set folder="t:\"  IF EXIST "%folder%" ( cd /d %folder% for /F "delims=" %%i in ('dir /b') do ( rmdir "%%i" /s/q || del "%%i" /s/q ) ) ELSE ( @echo this drive is not mounted, please enter a new one. set /p drive= cd /d !drive! pause for /F "delims=" %%i in ('dir /b') do ( rmdir "%%i" /s/q || del "%%i" /s/q )  ) @pause endlocal 

Lesen Sie weiter

Es funktioniert jetzt, ich musste sowohl "echo rmdir" als auch "echo dir" loswerden und einfach "rmdir" und "del" verlassen, um in diesem Fall tatsächlich den Inhalt des Ordners oder Laufwerks zu löschen. enableDelayedExpansion hat es geschafft. Pedro Velez vor 7 Jahren 0
@PedroVelez Entschuldigung, ich habe die `Echo`s als Sicherheitsvorkehrung beim Testen eingefügt und habe vergessen, sie zu entfernen: / Antwort aktualisiert. DavidPostill vor 7 Jahren 0
Der Teufel befand sich also im Detail bei @DavidPostill. Das Programm musste eher auf eine Variable als auf die Ausführungszeit als Ausführungszeit verweisen. In meinem Test lief der Code also erfolgreich im IF EXIST-Teil und nicht im ELSE-Teil. : / Pedro Velez vor 7 Jahren 0
@PedroVelez Ja, das ist irgendwie richtig, aber nichts mit dem 'if' zu tun. Die gesamte Datei wird analysiert, aber der Wert "Laufwerk" ist erst zur Laufzeit verfügbar, da Sie sie mit "set / p" eingelesen haben. `folder` ist zur Analyse verfügbar, da in der Batchdatei selbst explizit ein Wert angegeben wird. DavidPostill vor 7 Jahren 0
@PedroVelez Es lohnt sich, [verzögerte Erweiterung aktivieren und deaktivieren, was tun?] (Https://stackoverflow.com/q/22278456) und die verknüpften Fragen, da sie dies besser erklären als ich kann :) DavidPostill vor 7 Jahren 0
@PedroVelez In diesem speziellen Fall ja. Denken Sie jedoch daran, dass die verzögerte Erweiterung ein viel breiteres Problem darstellt. Siehe die Links, die ich Ihnen gegeben habe :) DavidPostill vor 7 Jahren 0