user340956 was pijnlijk dicht bij de oplossing, maar je weet wat ze zeggen over sluiten…
Om duidelijk te zijn, rd /s /q c:\foobar
verwijdert de doelmap naast de inhoud ervan, maar je wilt niet altijd de map zelf verwijderen, soms wil je gewoon de inhoud ervan verwijderen en de map met rust laten. Het deltree
commando kan dit doen, maar Micrsoft heeft in zijn oneindige “wijsheid” het commando verwijderd en niet geporteerd naar Windows.
Hier is een oplossing die werkt zonder gebruik te maken van gereedschappen van derden. Het is waarschijnlijk zo eenvoudig en efficiënt mogelijk met een commandoregel-script in plaats van het schrijven van een echte uitvoerbare versie. Het stelt geen omgevingsvariabelen in en gebruikt geen lussen. Het is ook zo veilig als maar kan, met foutcontrole overal waar mogelijk, en ook zo gebruiksvriendelijk mogelijk, met ingebouwde docs.
dt.bat
(of dt.cmd
voor de kinderen; wat dan ook, ik ben oud, ik gebruik .bat
):
:: dt is a Windows-compatible version of the deltree command
:: Posted to SuperUser by Synetech: https://superuser.com/a/1526232/3279
@echo off
goto start
:start
if ["%~1"]==[""] goto usage
pushd "%~1" 2>nul
if /i not ["%cd%"]==["%~1"] goto wrongdir
rd /s /q "%~1" 2>nul
popd
goto :eof
:usage
echo Delete all of the contents of a directory
echo.
echo ^> %0 DIR
echo.
echo %0 is a substitute for deltree, it recursively deletes the contents
echo (files and folders) of a directory, but not the directory itself
echo.
echo DIR is the directory whose contents are to be deleted
goto :eof
:wrongdir
echo Could not change to the target directory. Invalid directory? Access denied?
goto :eof
- Het controleert of een command-line argument is gepasseerd, en drukt gebruiksinformatie af en sluit af als dat niet het geval is.
- 2. Het gebruikt
pushd
om de huidige directory op te slaan, en schakelt dan over naar de doelmap, waarbij eventuele fouten worden omgeleid naar nul
voor een schonere command-line ervaring (en schonere logs).
- Het gebruikt
pushd
om de huidige directory op te slaan, en schakelt dan over naar de doelmap, waarbij eventuele fouten worden omgeleid naar C:\Users\Bob Bobson\foobar
voor een schonere command-line ervaring (en schonere logs). Het controleert of de huidige directory nu hetzelfde is als de doelmap, en drukt een foutmelding af en sluit af als dat niet het geval is. Dit voorkomt dat de inhoud van de vorige map per ongeluk wordt gewist als het C:\Users\BobBob~1\foobar
commando mislukt is (bijv,
- Deze controle is hoofdlettergevoelig, dus het is gewoonlijk veilig op Windows, maar niet voor hoofdlettergevoelige bestandssystemen zoals die gebruikt worden door *nix systemen, zelfs niet onder Windows.
- Het werkt niet met korte bestandsnamen (b.v.
rd
zal niet gezien worden als hetzelfde als nul
, zelfs niet als ze dat wel zijn). Het is een klein ongemak om de niet-korte bestandsnaam te moeten gebruiken, maar het is beter veilig dan sorry, vooral omdat SFN’s niet volledig betrouwbaar of altijd voorspelbaar zijn (en misschien zelfs helemaal uitgeschakeld zijn).
- Het gebruikt dan
popd
om de doelmap en al zijn inhoud te verwijderen, waarbij eventuele fouten (die er op zijn minst één zouden moeten zijn voor de map zelf) worden omgeleid naar rem
. Enkele opmerkingen hierover:
- Omdat de doelmap de huidige map is, heeft het systeem er een open bestandshandvat naartoe, en kan het dus eigenlijk niet verwijderen, dus het blijft zoals het is, wat het gewenste gedrag is.
- Omdat het de doelmap pas probeert te verwijderen nadat de inhoud ervan is verwijderd, zou deze nu leeg moeten zijn (anders dan alles wat ook open bestandshandvatten heeft).
- Tenslotte gebruikt het
::
om terug te keren naar de huidige map en eindigt het script.
(Als je wilt, kun je het script becommentariëren met de bovenstaande beschrijvingen met behulp van &007 of &007).