76 votes

Comment puis-je supprimer tous les fichiers/sous-dossiers dans un dossier donné via l'invite de commandes ?

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 ?

4voto

fireblood Points 315

Vous pouvez le faire rapidement et facilement en mettant ces trois instructions dans votre fichier batch :

mkdir empty_folder
robocopy /mir empty_folder "chemin_vers_le_dossier"
rmdir empty_folder

4voto

Ben Collins Points 11318

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 :

  1. 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.
  2. Il utilise pushd pour enregistrer le répertoire courant, puis bascule vers le répertoire cible, redirigeant les erreurs éventuelles vers nul pour une expérience en ligne de commande plus propre (et des journaux plus propres).
  3. 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 que C:\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).
  4. 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) vers nul. 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).
  5. 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 ::.)

2voto

Gio Points 29

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"

2voto

David Walker Points 21

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.

1voto

Ed Hammond Points 11

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

)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X