web-dev-qa-db-fra.com

Comment supprimer des fichiers / sous-dossiers d’un répertoire spécifique à l’invite de commande dans Windows

Disons qu'il existe une variable appelée %pathtofolder%, car il est clair qu'il s'agit du chemin complet d'un dossier.

Je veux supprimer chaque fichier et sous-dossier de ce répertoire, mais pas le répertoire lui-même.

Mais, il pourrait y avoir une erreur comme 'ce fichier/dossier est déjà utilisé' ... quand cela se produit, il devrait simplement continuer et ignorer ce fichier/dossier.

Quelqu'un peut-il me donner un ordre pour cela?

279
Deniz Zoeteman

Vous pouvez utiliser ce script Shell pour nettoyer le dossier et les fichiers dans C:\Tempsource :

del /q "C:\Temp\*"
FOR /D %%p IN ("C:\Temp\*.*") DO rmdir "%%p" /s /q

Créez un fichier de commandes (par exemple, delete.bat) contenant la commande ci-dessus. Accédez à l'emplacement où se trouve le fichier delete.bat, puis exécutez la commande suivante: delete.bat.

233
Iain

rmdir est ma commande préférée de tous les temps pour le travail. Cela fonctionne pour supprimer des fichiers énormes et des dossiers avec des sous-dossiers. Aucune sauvegarde n'est créée. Assurez-vous donc d'avoir bien copié vos fichiers avant d'exécuter cette commande.

RMDIR "FOLDERNAME" /S /Q

Cela supprime le dossier et tous les fichiers et sous-dossiers en mode silencieux.

320
Suresh

La solution la plus simple à laquelle je puisse penser est de supprimer tout le répertoire avec

RD /S /Q folderPath

Puis créez à nouveau ce répertoire:

MD folderPath
83
wojciech_rak

Cela supprimera les dossiers et les fichiers et laissera le dossier derrière.

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)
50
foxidrive
@ECHO OFF

Set dir=path-to-dir

Echo Deleting all files from %dir%
del %dir%\* /F /Q

Echo Deleting all folders from %dir%
for /d %%p in (%dir%\*) Do rd /Q /S "%%p"
@echo Folder deleted.


exit

... supprime tous les fichiers et dossiers situés sous le répertoire donné, mais pas le répertoire lui-même.

35
thepip3r
CD [Your_Folder]
RMDIR /S /Q .

Vous recevrez un message d'erreur vous indiquant que la commande RMDIR ne peut pas accéder au dossier en cours, donc qu'elle ne peut pas le supprimer.

Mise à jour :

De this commentaire utile (grâce à Moritz Both ), vous pouvez ajouter && entre, de sorte que RMDIR ne s'exécutera pas si la commande CD échoue (par exemple, répertoire mal tapé Nom):

CD [Your_Folder] && RMDIR /S /Q .

De référence de la ligne de commande Windows :

/S: Supprime une arborescence de répertoires (le répertoire spécifié et tous ses sous-répertoires, y compris tous les fichiers).

/Q: Spécifie le mode silencieux. Ne demande pas de confirmation lors de la suppression d'une arborescence de répertoires. (Notez que/q ne fonctionne que si/s est spécifié.)

26
O.Badr

RD signifie REMOVE Directory.

/ S: supprime tous les fichiers et sous-dossiers en plus du dossier lui-même. Utilisez cette option pour supprimer une arborescence de dossiers complète.

/ Q: silencieux - ne pas afficher la confirmation YN

Exemple :

RD /S /Q C:/folder_path/here
9
Sireesh Yarlagadda

J'utilise Powershell

Remove-Item c:\scripts\* -recurse

Cela supprimera le contenu du dossier, pas le dossier lui-même.

8
rhellem

Vous pouvez le faire en utilisant la commande suivante pour supprimer tout le contenu et le dossier parent lui-même:

RMDIR [/S] [/Q] [drive:]path            
4
Ripon Al Wasim

Aucune des réponses telles que publiées le 2018-06-01 à l'exception dede la ligne de commande unique postée par foxidrivevraiment supprimé tous les fichiers et tous les dossiers/répertoires dans _%PathToFolder%_. C'est la raison pour laquelle vous avez posté une réponse supplémentaire avec la simple ligne de commande permettant de supprimer tous les fichiers et sous-dossiers d'un dossier, ainsi qu'un fichier de traitement par lot avec une solution plus complexe expliquant pourquoi toutes les autres réponses publiées le 2018-06-01 à l'aide de DELet POURavec RDn'a pas pu nettoyer complètement un dossier .


La solution simple en ligne de commande qui peut bien sûr être également utilisée dans un fichier de commandes:

_pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )
_

Cette ligne de commande contient trois commandes exécutées les unes après les autres.

La première commande PUSHDpousse le chemin du répertoire actuel sur la pile et fait ensuite de _%PathToFolder%_ le répertoire en cours d'exécution du processus de commande.

Cela fonctionne également pour UNC par défaut, les chemins étant activés, les extensions de commande sont activées par défaut. Dans ce cas, PUSHDcrée une lettre de lecteur temporaire qui pointe sur la ressource réseau spécifiée, puis modifie le lecteur et le répertoire actuels à l’aide de la lettre de lecteur nouvellement définie.

PUSHDaffiche le message d'erreur suivant pour gérer STDERRsi le répertoire spécifié n'existe pas du tout:

Le système ne peut pas trouver le chemin spécifié.

Ce message d'erreur est supprimé en le redirigeant avec _2>nul_ vers le périphérique NUL.

La commande suivante RDest exécutée uniquement si la modification du répertoire en cours du processus de commande en cours en un répertoire spécifié a abouti, c.-à-d. Que le répertoire spécifié existe.

La commande RDavec les options _/Q_ et _/S_ supprime un répertoire silencieusementavec tous les sous-répertoiresmême si le répertoire spécifié contient des fichiers ou des dossiers avec attribut caché ou avec attribut en lecture seule. L'attribut système n'empêche jamais la suppression d'un fichier ou d'un dossier.

Non supprimés sont:

  1. Dossiers utilisés comme répertoire en cours pour tout processus en cours d'exécution. Toute l'arborescence de dossiers dans un tel dossier ne peut pas être supprimée si un dossier est utilisé comme répertoire actif pour tout processus en cours d'exécution.

  2. Fichiers actuellement ouverts par un processus en cours avec des autorisations d'accès au fichier définies sur fichier pour empêcher la suppression du fichier lors de son ouverture par l'application/le processus en cours d'exécution. Un tel fichier ouvert empêche également la suppression de toute l'arborescence de dossiers dans le fichier ouvert.

  3. Fichiers/dossiers sur lesquels l'utilisateur actuel ne dispose pas des autorisations (NTFS) requises pour supprimer le fichier/dossier, ce qui empêche également la suppression de l'arborescence de dossiers dans ce fichier/dossier.

La première raison pour ne pas supprimer un dossier est utilisée par cette ligne de commande pour supprimer tous les fichiers et sous-dossiers du dossier spécifié, mais pas le dossier lui-même. Le dossier est fait temporairement le répertoire en cours pour l'exécution du processus de commande qui empêche la suppression du dossier lui-même. Bien entendu, cela génère un message d'erreur avec la commande RD:

Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus.

Fichier n'est pas le bon terme, car en réalité le dossier est utilisé par un autre processus, le processus de commande en cours qui a exécuté la commande RD. Eh bien, en réalité, un dossier pour le système de fichiers est un fichier spécial avec un attribut de fichier répertoire qui explique ce message d'erreur. Mais je ne veux pas aller trop loin dans la gestion du système de fichiers.

Ce message d'erreur, comme tous les autres messages d'erreur susceptibles de se produire en raison des trois raisons mentionnées ci-dessus, est supprimé en le redirigeant avec _2>nul_ à partir du handle STDERRto device NUL.

La troisième commande POPDest exécutée indépendamment de la valeur de sortie de la commande RD.

POPDaffiche le chemin du répertoire indiqué par PUSHDà partir de la pile et modifie le répertoire actuel du processus de commande en cours, c.-à-d. restaure le répertoire actuel initial. POPDsupprime la lettre de lecteur temporaire créée par PUSHDdans le cas d'un chemin de dossier UNC.

Remarque:POPDpeut échouer en silence pour restaurer le répertoire en cours initial si le sous-répertoire en cours était un sous-répertoire du répertoire à propre qui n'existe plus. Dans ce cas particulier, _%PathToFolder%_ reste le répertoire en cours. Il est donc conseillé d’exécuter la ligne de commande ci-dessus à partir d’un sous-répertoire de _%PathToFolder%_.

Encore un fait intéressant :
J'ai également essayé la ligne de commande en utilisant un chemin UNC en partageant le répertoire local _C:\Temp_ avec le nom de partage Temp et en utilisant le chemin UNC _\\%COMPUTERNAME%\Temp\CleanTest_ affecté à la variable d'environnement PathToFolder. sous Windows 7. Si le répertoire en cours d’exécution de la ligne de commande est un sous-répertoire du dossier local partagé auquel on a accédé en utilisant le chemin UNC, c’est-à-dire que _C:\Temp\CleanTest\Subfolder1_, _Subfolder1_ est supprimé par RDet next POPDne parvient pas à reconstituer _C:\Temp\CleanTest\Subfolder1_ à nouveau le répertoire en cours, ce qui permet à _Z:\CleanTest_ de rester en tant que répertoire en cours pour l'exécution de la commande en cours. . Ainsi, dans ce cas très particulier, la lettre de lecteur temporaire reste en place jusqu'à ce que le répertoire actuel soit modifié, par exemple avec _cd /D %SystemRoot%_, en un répertoire local réellement existant. Malheureusement, POPDne se ferme pas avec une valeur supérieure à 0 s'il ne parvient pas à restaurer le répertoire en cours initial, rendant impossible la détection de cette condition d'erreur très spéciale en utilisant simplement le code de sortie de POPD. Cependant, on peut supposer que personne ne rencontre jamais ce cas d'erreur très particulier, car les chemins d'accès UNC ne sont généralement pas utilisés pour accéder aux fichiers et dossiers locaux.

Pour encore mieux comprendre les commandes utilisées, ouvrez une fenêtre d'invite de commande, exécutez-y les commandes suivantes et lisez très attentivement l'aide affichée pour chaque commande.

  • _pushd /?_
  • _popd /?_
  • _rd /?_

ne seule ligne avec plusieurs commandes utilisant un fichier batch Windows explique les opérateurs _&&_ et _&_ utilisés ici.


Regardons ensuite la solution de traitement par lots à l'aide de la commande DELpour supprimer des fichiers dans _%PathToFolder%_ et POURet RDpour supprimer les sous-dossiers de _%PathToFolder%_.

_@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"

rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"

rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder

rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"

rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder

rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul

rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

:EndCleanFolder
endlocal
_

Le fichier de commandes vérifie d'abord que la variable d'environnement PathToFolder est vraiment définie avec un chemin de dossier sans guillemets et sans barre oblique inverse à la fin. La barre oblique inverse à la fin ne poserait pas de problème, mais les guillemets dans le chemin du dossier pourraient poser problème en raison de la valeur de PathToFolder est concaténée avec d'autres chaînes lors de l'exécution du fichier de traitement par lots.

Important sont les deux lignes:

_del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul
_

La commande DELest utilisée pour supprimer tous les fichiers du répertoire spécifié.

  • L'option _/A_ est nécessaire pour traiter réellement tous les fichiers, y compris les fichiers avec attribut masqué que DELignorerait sans utiliser l'option _/A_.
  • L'option _/F_ est nécessaire pour forcer la suppression des fichiers avec un ensemble d'attributs en lecture seule.
  • L'option _/Q_ est nécessaire pour exécuter une suppression silencieuse de plusieurs fichiers sans demander à l'utilisateur si plusieurs fichiers doivent être réellement supprimés.
  • _>nul_ est nécessaire pour rediriger la sortie des noms de fichiers écrits de manière à gérer STDOUTvers le périphérique NULdont ne peut pas être supprimé car le fichier est actuellement ouvert ou que l'utilisateur n'a pas l'autorisation de supprimer le fichier.
  • _2>nul_ est nécessaire pour rediriger le message d'erreur généré pour chaque fichier ne pouvant pas être supprimé du descripteur STDERRvers le périphérique NUL.

Les commandes POURet RDsont utilisées pour supprimer tous les sous-répertoires du répertoire spécifié. Mais _for /D_ n'est pas utilisé en raison de POURignore les sous-répertoires avec un ensemble d'attributs masqués. Pour cette raison, _for /F_ est utilisé pour exécuter la ligne de commande suivante dans un processus de commande séparé démarré en arrière-plan avec _cmd.exe /C_:

_dir "%PathToFolder%\*" /AD /B 2>nul
_

DIRsort au format nu en raison de _/B_ les entrées de répertoire avec l'attribut D, c'est-à-dire les noms de tous les sous-répertoires du répertoire spécifié, indépendamment des autres attributs tels que attribut caché sans chemin. _2>nul_ est utilisé pour rediriger le message d'erreur généré par DIRsur aucun répertoire trouvé à partir du descripteur STDERRvers le périphérique NUL.

L'opérateur de redirection _>_ doit être échappé avec le caractère caret _^_ sur POUR QUE LA LIGNEsoit interprétée comme un caractère littéral lorsque l'interpréteur de commandes Windows traite cette ligne de commande. avant d'exécuter la commande POUR, qui exécute la ligne de commande dir intégrée dans un processus de commande séparé démarré en arrière-plan.

FORtraite la sortie capturée écrite pour gérer STDOUTdu processus de commande démarré qui sont les noms des sous-répertoires sans chemin et jamais entre guillemets.

POURavec l'option _/F_ ignore les lignes vides qui ne figurent pas ici sous la forme DIRavec l'option _/B_ ne génère pas de lignes vides.

POURignorerait également les lignes commençant par un point-virgule, qui est le caractère de fin de ligne par défaut. Un nom de répertoire peut commencer par un point-virgule. Pour cette raison, _eol=|_ est utilisé pour définir le caractère de barre verticale en tant que caractère de fin de ligne dont aucun nom ni répertoire ni fichier ne peut avoir le nom.

FORdiviserait la ligne en sous-chaînes en utilisant des séparateurs espace et tabulation horizontale et n'affecterait que la première chaîne délimitée par des tabulations/espaces à la variable de boucle spécifiée I. Ce comportement de division n'est pas souhaité ici car un nom de répertoire peut contenir un ou plusieurs espaces. Par conséquent, _delims=_ est utilisé pour définir une liste vide de délimiteurs afin de désactiver le comportement de fractionnement de ligne et d'être affecté à la variable de boucle I toujours le nom de répertoire complet.

La commande POURexécute la commande RDpour chaque nom de répertoire sans chemin, raison pour laquelle le RDligne de commande/le chemin du dossier doit être spécifié une nouvelle fois, ce qui est concaténé avec le nom du sous-dossier.

Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commande, exécutez-y les commandes suivantes et lisez très attentivement toutes les pages d'aide affichées pour chaque commande.

  • _del /?_
  • _dir /?_
  • _echo /?_
  • _endlocal /?_
  • _for /?_
  • _goto /?_
  • _if /?_
  • _rd /?_
  • _rem /?_
  • _set /?_
  • _setlocal /?_
4
Mofi

Utilisez le bloc-notes pour créer un document texte et copier/coller ceci:

rmdir /s/q "%temp%"
mkdir "%temp%"

Sélectionnez Enregistrer sous, Nom du fichier:

delete_temp.bat

Enregistrer en tant que type: Tous les fichiers et cliquez sur le bouton Enregistrer.

Travaillez sur n'importe quel type de compte (administrateur ou utilisateur standard), lancez-le! J'utilise variable variable dans cet exemple, mais vous pouvez utiliser n'importe quelle autre! p.s. Pour Windows uniquement!

4
Filip Gjorgjevikj

Pour supprimer le fichier:

del PATH_TO_FILE

Pour supprimer un dossier contenant tous les fichiers:

rmdir /s /q PATH_TO_FOLDER

Supprimer tous les fichiers d'un dossier spécifique (ne pas supprimer le dossier lui-même) est un peu compliqué. del /s *.* ne peut pas supprimer de dossiers, mais supprime les fichiers de tous les sous-dossiers. Donc, deux commandes sont nécessaires:

del /q PATH_TO_FOLDER\*.*
for /d %i in (PATH_TO_FOLDER\*.*) do @rmdir /s /q "%i"
4
Maxim Suslov

J'ai essayé plusieurs de ces approches, mais aucune n'a fonctionné correctement.
J'ai trouvé cette approche en deux étapes sur le site Ligne de commande Windows :

forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==FALSE del @file"

forfiles /P %pathtofolder%  /M * /C "cmd /c if @isdir==TRUE rmdir /S /Q @file"

Cela a fonctionné exactement comme j'avais besoin et comme spécifié par l'OP.

1
Paul Haan
@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%\*.*"
rem next line cleans up the folder's content
FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q
0
Robie