Alternative n ° 1: FOR / R est plus intuitif que n ° 2 pour moi.
Alternative n ° 2: FOR / F corrige le problème "d'espaces dans les noms" dans la suggestion de BrianAdkins.
Alternative n ° 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 solutions fonctionnent. J'ai essayé d'utiliser FOR TOKENS, mais j'ai ensuite dû supprimer les en-têtes et les pieds de page. J'ai également envisagé de créer un petit fichier .bat et de l'appeler, mais cela ajoute un autre fichier (bien qu'il offre une plus grande flexibilité, comme le ferait une fonction).
J'ai testé toutes les alternatives avec répertoire et noms de fichiers avec des espaces incorporés, un nom de fichier de plus de 200 caractères, un nom de fichier sans extension et la racine d'un petit lecteur (juste pour le temps; un peu lent - comme l'a suggéré Brian - mais alors cherche dans l'Explorateur Windows, c'est pourquoi j'ai installé l'application de recherche Everything).
Alternative n ° 1: POUR / R
Meilleur (?) Tout en essayant de comprendre pourquoi la solution de Brian ne fonctionnait pas pour moi, j'ai examiné 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 variante 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écursivité)
@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 Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
Alternative n ° 2: POUR / F
BrianAdkins a suggéré: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Une réponse corrigée est:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Une réponse plus complète avec les répertoires supprimés et le résultat (ajouté) dans 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
Remarque: "delims = *" spécifie un caractère non autorisé dans les noms de fichiers.
Remarque: la 2e commande supprime également les répertoires via / a: -d.
Remarque: Utilisez le nom de variable FOR en majuscule pour clarifier la distinction entre variable et paramètres de variable si quelqu'un choisit des noms de variable différents.
Remarque: Ajoutée au fichier uniquement pour les grimaces, car le terminal opérateur a demandé une sortie dans un fichier.
Je suppose que je devrais vraiment vérifier le statut d’ECHO et le réinitialiser également.
Problème - 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 sur ma configuration Vista).
Exemple - Wrong
(sans délimitations; inclut la suppression du répertoire par OP mais avec une taille à la fois avant et après le nom de fichier pour mettre en évidence)
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\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
Exemple - Correct
(note sortie à l'écran, non ajouté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 Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
Alternative n ° 3: FORFILES (Numéro de citation)
Cette solution est directement issue des deux derniers exemples de la documentation de FORFILES ( forfiles /?
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
La combinaison de ces exemples et l'écriture dans un fichier donne la réponse (presque):
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 si echo on
ou echo off
est basculé.
Ajouter une ligne vide séparant chaque répertoire constituerait une extension triviale du SI.
Attention : l'utilisation du masque/m *.*
ne renverra pas les fichiers sans extension (comme le dernier fichier de l'exemple)!
De côté : Ceci écrit un fichier dans chaque répertoire avec le contenu de ce répertoire uniquement:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
ce que le PO voulait, mais parfois pratique.
Exemple - Works (mais avec fullpath 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 Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.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 inclut un répertoire supplémentaire avec un nom de fichier super long et un nom de fichier sans extension.
Problème: Chemin dans les citations
Ainsi, existe-t-il un moyen simple de supprimer les guillemets indésirables (?) Selon l'exemple OP et de sauvegarder la variante n ° 3: FORFILES. (Question rhétorique: les citations sont-elles une fonctionnalité ou un défaut?)
"tokens=*"
comme suit@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za