J'essaie de générer un fichier texte contenant le nom du fichier (y compris le chemin d'accès complet) et la taille du fichier pour tous les fichiers d'un répertoire particulier et de l'un de ses sous-répertoires (c'est-à-dire de manière récursive). Idéalement, je ne veux pas de virgules dans la taille du fichier (mais je me contenterai d'eux!)
La commande suivante le fait mais sans la taille du fichier:
dir /b /s /a:-D > results.txt
Un exemple de sortie ressemblerait à ceci:
C:\Users\Martin\Pictures\Table\original\PC120013.JPG 227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG 123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG 932344
Je ne pense pas que ce soit possible d'utiliser dir
seul, bien que j'aimerais être prouvé avoir tort. Y a-t-il un autre moyen de faire cela en utilisant uniquement les commandes disponibles à partir de l'invite de commandes?
la source
"tokens=*"
comme suit@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
txt
fichier?for /r %a in (*) do echo %~fa %~za
>> C:\Temp\VideoList.txt
- Les résultats du processus précédent ont été écrits dans un fichier texte nommé VideoList . L'utilisation d'un > écrasera le fichier ( s'il existe déjà ) et d'un >> ajoutera les nouveaux résultats à la fin du fichier texte ( s'il existe déjà ). Si le fichier texte n'existe pas encore, cette commande écrit un nouveau fichier portant le nom spécifié.@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
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.)
Exemple - Works (répertoire différent de celui ci-dessus pour démontrer la récursivité)
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:
Une réponse plus complète avec les répertoires supprimés et le résultat (ajouté) dans un fichier est:
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):
Exemple - Correct (note sortie à l'écran, non ajoutée au fichier)
Alternative n ° 3: FORFILES (Numéro de citation)
Cette solution est directement issue des deux derniers exemples de la documentation de FORFILES (
forfiles /?
).La combinaison de ces exemples et l'écriture dans un fichier donne la réponse (presque):
Notez que le chemin est entre guillemets dans la sortie.
Peu importe si
echo on
ouecho 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)
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?)
la source
Je me rends compte que cela nécessite une utilité supplémentaire , mais vous pouvez y parvenir assez succinctement en utilisant l’ utilitaire sfk :
(J'ai eu l'approche en utilisant la commande sfk chaînant ici )
la source
Cela peut être tricher sur la question des PO. Cependant, la question n'est plus pertinente sur les systèmes Windows modernes. L'alias Dir a été utilisé pour aider à établir le lien logique.
la source
powershell "Get-ChildItem -Recurse| select name,length"
Vous trouverez ci-dessous ce que je recherchais pour localiser divers fichiers vidéo occupant trop de place sur un lecteur réseau et pour écrire les résultats dans un fichier texte sur un PC local.
Je publie ma propre réponse un peu tardive pour trois raisons. Un, j'aime les réponses concises. Deuxièmement, cette ligne de script unique fonctionnait pour moi dans plusieurs paramètres, y compris sur un réseau. Troisièmement, par commentaire potentiellement obscur de Don Vince dans la réponse de BrianAdkins, l’utilisation de jetons peut contourner les problèmes liés aux noms de fichiers contenant des espaces.
for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt
J'ai remarqué que de très longs chemins de fichiers / noms de fichiers (des centaines de caractères) peuvent également provoquer des erreurs, mais la recherche ne s'arrête pas là. Cependant, le chemin reste incomplet pour votre / vos cible (s). Une fois noté, vous pouvez compenser en commençant plus profondément dans la structure de dossiers pour éliminer cette erreur.
Cette page ss64 présente très bien l’utilisation de la commande dir . Elle répertorie tous les commutateurs, de nombreuses combinaisons de commutateurs, et présente plusieurs exemples utiles de syntaxe appropriée. Ce n'est pas aussi complet que les différentes communautés de Stack Exchange, mais la présentation est parfaitement claire une fois que vous êtes familiarisé avec les scripts en ligne de commande / batch.
la source
J'ai atteint ceci avec la commande suivante:
Le résultat:
PS Ceci est basé sur la réponse de BillR (variante n ° 1). Cependant, dans mon cas, il se bloque avec
@echo off
.la source
Je trouve la commande "du" très utile et elle fonctionne à la fois sous Windows et sous Unix (utilisée pour vérifier si tous les fichiers ont été copiés lors du transfert d'une grande quantité de données d'un PC Windows vers un serveur Web Linux):
les sorties:
Cependant, je ne pouvais que voir correctement les caractères spéciaux dans le Bloc-notes, pas dans le Bloc-notes ++ (il doit s'agir d'un encodage ANSI / UTF-8, pas le temps d'analyser exactement maintenant). De plus, je n'ai pas trouvé de solution pour afficher la taille après le nom du fichier. Utilisez les options "b" ou "k" au lieu de "h" pour afficher la taille en octets ou en kilo-octets. J'ai eu quelques problèmes lors de l'exécution de la commande en dehors du dossier que je souhaite analyser. Il est donc préférable de saisir la commande dans le bon répertoire ("C: \ your_dir" dans cet exemple) et de la spécifier dans la commande.
la source
Omettez le b dans le répertoire / b / s / a: -D> results.txt et les résultats devraient ressembler à (c.-à-d. Dir / s / a: -D> résultats.txt):
la source
Sans être trop compliqué, cela devrait produire le résultat souhaité. Cela donnera un peu plus que le PO demandé, mais je pensais que cela valait la peine d'être mentionné. Ajoutez le commutateur / R pour spécifier un répertoire autre que le répertoire actuel.
la source
ERROR: Invalid syntax. Value expected for '/r'
donc à revenir à la planche à dessin et à fournir la syntaxe correcte, puis modifiez votre réponse avec les détails appropriés.where /?
dit: «Par défaut, la recherche s'effectue dans le répertoire en cours et dans les chemins spécifiés par la variable d'environnement PATH . ”- Ainsi, votrewhere * /t
commande répertorie tous les fichiersC:\Windows\System32
, certains sous-répertoiresC:\Program Files
et tous les autres répertoiresPATH
. Pour moi, c'était plus de 3000 lignes. Veuillez envisager de modifier votre réponse pour la rendre raisonnable. PS Sans/R
, ce n'est pas récursif.