L'alternative n°1 : POUR /R est plus intuitive que la n°2 pour moi.
Alternative #2 : FOR /F corrige le problème des “espaces dans les noms” dans la suggestion de BrianAdkins.
Alternative #3 : FORFILES serait mon choix, sauf que le chemin est entre guillemets.
Brian ou d'autres gourous ont peut-être une solution plus élégante ou peuvent suggérer une douzaine d'autres solutions mais ces trois-là fonctionnent. J'ai essayé d'utiliser FOR TOKENS, mais j'ai dû ensuite enlever les en-têtes et les pieds de page, alors je suis revenu au numéro 1. J'ai également envisagé de créer un petit fichier .bat et de l'appeler, mais cela ajoute un autre fichier (bien que cela offre une plus grande flexibilité, comme le ferait une fonction).
J'ai testé toutes les alternatives avec des noms de répertoires et de fichiers avec des espaces intégrés, un nom de fichier de plus de 200 caractères, un nom de fichier sans extension, et à la racine d'un petit disque (juste pour le temps ; un peu lent – comme Brian l'a suggéré – mais la recherche dans l'explorateur Windows l'est aussi ; c'est pourquoi j'ai installé l'application de recherche Everything).
Alternative #1 : FOR /R
Best( ?) En essayant de comprendre pourquoi la solution de Brian ne fonctionnait pas pour moi, j'ai regardé HELP FOR et j'ai décidé d'essayer l'approche /R. (La création d'un fichier serait la même que dans la solution n°2. )
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Exemple - Works (répertoire différent de celui ci-dessus pour démontrer la récursion)
@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spacesnd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Alternative #2 : FOR /F
suggérée par BrianAdkins : @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
A réponse corrigée est :
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
A réponse plus complète avec les répertoires supprimés et la sortie (annexée) à un fichier est :
@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt
Note : “delims=*” spécifie un caractère non autorisé dans les noms de fichiers.
Note : la 2ème commande supprime également les répertoires via /a:-d.
Note : le nom de la variable FOR a été mis en majuscule pour clarifier la distinction entre les paramètres de la variable et de la variable si quelqu'un choisit des noms de variables différents.
Note : Ajouté au fichier juste pour les grins car l'OP a demandé la sortie vers un fichier.
Je suppose que je devrais vraiment vérifier le statut de l'ECHO et le réinitialiser également.
Sujet - Espaces dans les noms
La solution proposée par Brian ne gère pas les noms de fichiers et de dossiers contenant des espaces (du moins pas dans ma configuration Vista).
Exemple - Mauvais(Sans délimitation ; Inclut la suppression du répertoire par OP mais avec la taille avant et après le nom de fichier pour l'accentuation)
Nom et taille tronqués (4 fichiers sur 6 incorrects) :
@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder
C:\DeleteLater\Folder
C:\DeleteLater\FolderNoSpacesrd
28726032 C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Exemple - Correct(Note sortie à l'écran, non annexée au fichier)
@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spacesnd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Alternative #3 : FORFILES (Question de citation)
Cette solution est directement issue des deux derniers exemples de la documentation FORFILES (forfiles /?
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
En combinant ces exemples et en écrivant dans un fichier, on obtient (presque) la réponse :
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Notez que le chemin est entre guillemets dans la sortie.
Peu importe que echo on
ou echo off
soit activé.
L'ajout d'une ligne blanche séparant chaque répertoire serait une extension triviale de la FI.
Caution : L'utilisation du masque /m *.*
ne renverra pas les fichiers sans extension (comme le dernier fichier dans l'exemple) !
Aside : Cela permet d'écrire un fichier dans chaque répertoire avec le contenu de ce seul répertoire :
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Ce n'est pas ce que voulait l'OP mais c'est parfois pratique.
Exemple - Works (mais avec le chemin complet entre guillemets)
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize"
"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spacesnd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0
Cet exemple comprend un répertoire supplémentaire avec un nom de fichier super long et un nom de fichier sans extension.
Sujet : Chemin d'accès entre guillemets
Donc, y a-t-il un moyen facile de supprimer les guillemets indésirables( ?) selon l'exemple OP et de sauvegarder l'alternative n° 3 : FORFILES. (Question rhétorique : les guillemets sont-ils une caractéristique ou un défaut ?)