user340956 était douloureusement proche de la solution, mais vous savez ce qu'on dit de proche…
Pour être clair, rd /s /q c:\foobar
supprime le répertoire cible en plus de son contenu, mais vous ne voulez pas toujours supprimer le répertoire lui-même, parfois vous voulez juste supprimer son contenu et laisser le répertoire tranquille. La commande deltree
pouvait le faire, mais Micrsoft, dans son infinie “sagesse” a supprimé la commande et ne l'a pas portée sur Windows.
Voici une solution qui fonctionne sans avoir recours à des outils tiers. Elle est probablement aussi simple et efficace que possible avec un script en ligne de commande au lieu d'écrire un véritable exécutable. Il ne définit aucune variable d'environnement et n'utilise aucune boucle. Il est aussi aussi sûr que possible, avec une vérification des erreurs partout où c'est possible, et aussi convivial que possible, avec des documents intégrés.
dt.bat
(ou dt.cmd
pour les enfants ; peu importe, je suis vieux, j'utilise .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
Voici comment il fonctionne :
- Il vérifie si un argument de ligne de commande a été passé, et imprime les informations d'utilisation et quitte si ce n'est pas le cas.
- Il utilise
pushd
pour sauvegarder le répertoire courant, puis passe au répertoire cible, redirigeant les erreurs éventuelles vers nul
pour une expérience en ligne de commande plus propre (et des journaux plus propres).
- Il vérifie si le répertoire courant est maintenant le même que le répertoire cible, et imprime un message d'erreur et quitte si ce n'est pas le cas. Cela permet d'éviter de supprimer accidentellement le contenu du répertoire précédent si la commande
pushd
a échoué (par ex, )
- Cette vérification n'est pas sensible à la casse, donc elle est généralement sûre sous Windows, mais ne l'est pas pour les systèmes de fichiers sensibles à la casse comme ceux utilisés par les systèmes *nix, même sous Windows.
- Elle ne fonctionne pas avec les noms de fichiers courts (par exemple
C:\Users\Bob Bobson\foobar
ne sera pas considéré comme étant identique à C:\Users\BobBob~1\foobar
même s'ils le sont réellement). C'est un léger inconvénient de devoir utiliser le nom de fichier non court, mais il vaut mieux prévenir que guérir, d'autant plus que les SFN ne sont pas complètement fiables ou toujours prévisibles (et peuvent même être complètement désactivés).
- Il utilise ensuite
rd
pour supprimer le répertoire cible et tout son contenu, en redirigeant les éventuelles erreurs (qui devraient être au moins une pour le répertoire lui-même) vers nul
. Quelques remarques à ce sujet :
- Comme le répertoire cible est le répertoire courant, le système a un gestionnaire de fichiers ouvert vers lui, et donc il ne peut pas le supprimer réellement, il reste donc tel quel, ce qui est le comportement souhaité.
- Parce qu'il n'essaie pas de supprimer le répertoire cible avant que son contenu n'ait été supprimé, il devrait maintenant être vide (à l'exception de tout ce qui a également un gestionnaire de fichiers ouvert).
- Enfin, il utilise
popd
pour revenir au répertoire courant précédent et termine le script.
(Si vous le souhaitez, vous pouvez commenter le script avec les descriptions ci-dessus en utilisant rem
ou ::
.)