Je voudrais supprimer tous les fichiers et sous-dossiers dans un fichier de commandes sous Windows 7 et conserver le dossier principal. Fondamentalement, vider le dossier. Quelle est l'instruction en ligne de commande pour cela ?
Réponses
Trop de publicités?User340956 était douloureusement proche de la solution, mais vous savez ce qu'ils disent à propos de la proximité...
Pour être clair, rd /s /q c:\foobar
supprime le répertoire cible ainsi que 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 intact. La commande deltree
pouvait faire cela, mais Microsoft, dans sa "sagesse" infinie, a supprimé la commande et ne l'a pas portée sur Windows.
Voici une solution qui fonctionne sans avoir recours à des outils tiers. C'est probablement aussi simple et efficace que possible avec un script en ligne de commande au lieu d'écrire un exécutable réel. Il ne définit aucun variable d'environnement et n'utilise aucune boucle. C'est aussi sûr que possible, avec des vérifications d'erreurs partout où c'est possible, et aussi convivial que possible, avec de la documentation intégrée.
dt.bat
(ou dt.cmd
pour les enfants; peu importe, je suis vieux, j'utilise .bat
) :
:: dt est une version compatible Windows de la commande deltree
:: Publié sur SuperUser par 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 Supprime tous les contenus d'un répertoire
echo.
echo ^> %0 DIR
echo.
echo %0 est un substitut de deltree, il supprime de manière récursive les contenus
echo (fichiers et dossiers) d'un répertoire, mais pas le répertoire lui-même.
echo.
echo DIR est le répertoire dont les contenus doivent être supprimés
goto :eof
:wrongdir
echo Impossible de basculer vers le répertoire cible. Répertoire invalide ? Accès refusé ?
goto :eof
Voici comment cela fonctionne :
- Il vérifie si un argument de ligne de commande a été passé, affiche les informations d'utilisation et quitte si ce n'est pas le cas.
- Il utilise
pushd
pour enregistrer le répertoire courant, puis bascule vers le répertoire cible, redirigeant les erreurs éventuelles versnul
pour une expérience en ligne de commande plus propre (et des journaux plus propres). - Il vérifie que le répertoire courant est maintenant le même que le répertoire cible, affiche un message d'erreur et quitte sinon. Cela évite de supprimer accidentellement les contenus du répertoire précédent si la commande
pushd
a échoué (par exemple, en passant un répertoire invalide, une erreur d'accès, etc.)- Cette vérification est insensible à la casse, donc c'est généralement sûr sur Windows, mais pas pour les systèmes de fichiers sensibles à la casse comme ceux utilisés par les systèmes *nix, même sous Windows.
- Cela ne fonctionne pas avec les noms de fichiers courts (par exemple
C:\Users\Bob Bobson\foobar
ne sera pas considéré comme étant le même queC:\Users\BobBob~1\foobar
même s'ils le sont en réalité). C'est un léger inconvénient de devoir utiliser le nom de fichier non court, mais il vaut mieux être prudent, surtout que les SFN ne sont pas totalement fiables ou toujours prévisibles (et peuvent même être complètement désactivés).
- Ensuite, il utilise
rd
pour supprimer le répertoire cible et tous ses contenus, redirigeant les erreurs éventuelles (il devrait y en avoir au moins une pour le répertoire lui-même) versnul
. Quelques notes à ce sujet :- Comme le répertoire cible est le répertoire courant, le système a une poignée de fichier ouverte dessus, et donc il ne peut pas le supprimer réellement, donc il reste tel quel, ce qui est le comportement souhaité.
- Parce qu'il n'essaie pas de supprimer le répertoire cible avant que son contenu ait été supprimé, il devrait maintenant être vide (autre que tout ce qui a également des poignées de fichiers ouvertes).
- Enfin, il utilise
popd
pour revenir au répertoire précédemment courant et termine le script.
(Si vous le souhaitez, vous pouvez commenter le script avec les descriptions ci-dessus en utilisant rem
ou ::
.)
Si vous souhaitez supprimer tous les fichiers d'un dossier, y compris tous les sous-dossiers et ne pas compter sur des conditions d'erreur pour conserver le dossier racine intact (comme je l'ai vu dans une autre réponse), vous pourriez avoir un fichier batch comme celui-ci :
@echo off
REM Vérification du paramètre de ligne de commande
if "%~1"=="" (
echo Paramètre requis.
exit /b 1
) else (
REM Changer de répertoire et suivre l'ancien
pushd "%~1"
if errorlevel 1 (
REM Le répertoire passé en ligne de commande n'est pas valide, arrêtez-vous ici.
exit /b %errorlevel%
) else (
REM Tout d'abord, nous supprimons tous les fichiers, y compris ceux des sous-dossiers, sans confirmation
del * /S /Q
REM Ensuite, nous supprimons tous les sous-dossiers vides qui ont été laissés derrière
for /f %%D IN ('dir /b /s /a:d "%~1"') DO rmdir /S /Q "%%D"
REM Revenir au répertoire précédent
popd
REM Tout va bien.
exit /b 0
)
)
Ensuite, vous pourriez simplement l'appeler avec :
empty_my_folder.bat "C:\whatever\is\my folder"
Pour supprimer tous les sous-répertoires et leurs contenus, utilisez robocopy. Créez un répertoire vide, par exemple C:\Empty. Disons que vous voulez vider C:\test qui contient de nombreux sous-répertoires, des fichiers et d'autres sous-répertoires et fichiers supplémentaires : robocopy c:\empty c:\test /purge ensuite, rd C:\test si nécessaire.
Cela a mieux fonctionné pour moi lorsque j'avais des espaces dans les noms de dossier.
@echo off
REM ---- Fichier Batch pour nettoyer un dossier
REM Vérification du paramètre de ligne de commande
if "%~1"=="" (
echo Paramètre requis.
exit /b 1
) else (
echo ***********************************************************************************
echo *** Suppression de tous les fichiers, y compris ceux dans les sous-dossiers, sans confirmation ***
del "%~1\*" /S /Q
echo ***********************************************************************************
REM Suppression de tous les sous-dossiers vides restants
FOR /R "%~1" %%D IN (.) DO (
if "%%D"=="%~1\." (
echo *** Nettoyage du dossier: %~1 ***
) else (
echo Dossier supprimé "%%D"
rmdir /S /Q "%%D"
)
)
REM Tout est bon.
exit /b 0
)