Dans un répertoire et de manière récursive dans ses sous-répertoires, ce qui signifie que chaque répertoire d'un répertoire est traité, comment compiler une liste complète des extensions uniques dans le répertoire?
Le système d'exploitation est Windows XP avec toutes les mises à jour actuelles, mais je peux exécuter le script si je suis capable de dire ce qu'il fait, bien que je préfère ne pas avoir à installer dot-net, car je ne le fais vraiment pas. J'aime ça.
Ce script batch le fera.
@echo off
set target=%~1
if "%target%"=="" set target=%cd%
setlocal EnableDelayedExpansion
set LF=^
rem Previous two lines deliberately left blank for LF to work.
for /f "tokens=*" %%i in ('dir /b /s /a:-d "%target%"') do (
set ext=%%~xi
if "!ext!"=="" set ext=FileWithNoExtension
echo !extlist! | find "!ext!:" > nul
if not !ERRORLEVEL! == 0 set extlist=!extlist!!ext!:
)
echo %extlist::=!LF!%
endlocal
Enregistrez-le sous le nom de fichier .bat
et exécutez-le à l'aide de la commande batchfile
(remplacez le nom que vous l'avez nommé) pour répertorier le répertoire en cours ou spécifiez un chemin avec batchfile "path"
. Il cherchera dans tous les sous-répertoires.
Si vous souhaitez exporter dans un fichier, utilisez batchfile >filename.txt
(ou batchfile "path" >filename.txt
).
Tout ce qui précède la ligne for /f...
définit simplement les choses: le répertoire cible est recherché, active expansion retardée , ce qui me permet de mettre à jour les variables dans la boucle et définit une nouvelle ligne (LF
name __) = que je peux utiliser pour une sortie plus nette. Oh, et le %~1
signifie "récupère le premier argument, en supprimant les guillemets", ce qui évite les doubles guillemets - voir for /?
.
La boucle utilise cette commande dir /b /s /a:-d "%target%"
, en récupérant une liste de tous les fichiers de tous les sous-répertoires de la cible.
%%~xi
extrait l'extension des chemins complets renvoyés par la commande dir
name__.
Une extension vide est remplacée par "FileWithNoExtension", vous savez donc qu'il existe un tel fichier. Si j'ajoutais une ligne vide à la place, ce n'est pas aussi évident.
Toute la liste en cours, si elle est envoyée via une commande find
name__, pour garantir l'unicité. La sortie texte de la commande find est envoyée à nul
name__, essentiellement un trou noir - nous ne le voulons pas. Etant donné que nous ajoutons toujours un :
à la fin de la liste, nous devons également nous assurer que la requête de recherche se termine par un :
afin qu'il ne corresponde pas aux résultats partiels - voir les commentaires.
% ERRORLEVEL% est défini par la commande find
name__; la valeur 0 indique qu'il y a une correspondance. Donc, si ce n'est pas 0, l'extension actuelle n'est pas sur la liste jusqu'à présent et devrait être ajoutée.
La ligne echo est en sortie, et je remplace également mes caractères réservés (:
) par des nouvelles lignes pour lui donner une apparence agréable.
Bien que ne répondant pas strictement aux exigences d'un script batch, j'ai utilisé un script powershell à une seule ligne:
Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt
Vous pouvez éventuellement l'exécuter à partir du fichier de ligne de commande/batch:
Powershell -Command "& Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt"
Je ne revendique aucun crédit pour cela, et bien sûr, vous aurez besoin de l’installation de Powershell. Pour les versions plus récentes de Windows, il n’ya pas de solution.
Si vous supprimez C:\MyDirectory
, il sera exécuté dans le répertoire en cours.
À la fin, il produira un fichier FileExtensions.txt contenant les éléments suivants:
+-------+------+
| Count | Name |
+-------+------+
| ----- | ---- |
| 8216 | .xml |
| 4854 | .png |
| 4378 | .dll |
| 3565 | .htm |
| ... | ... |
+-------+------+
Selon la structure de votre dossier, des erreurs peuvent parfois vous avertir que le chemin d'accès est long.
Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
Les sous-répertoires de celui-ci ne seront pas non plus analysés, mais les résultats pour tout le reste s'afficheront.
Voici une réponse détaillée en utilisant PowerShell (avec Windows XP, vous devrez installer PowerShell):
J'ai trouvé utile de changer
if "!ext!"=="" set ext=FileWithNoExtension
à
if "!ext!"=="" set ext=.FileWithNoExtension
et de changer
echo %extlist::=!LF!%
à
echo %extlist::=!LF!% > ext-list.txt
Le fichier généré contient (pas de sauts de ligne, mais peu importe) .bat.pdf.skp.ai.png.jpg.tif.pcp.txt.lst.ttf.dfont.psd.indd.docx.PDF.JPG.gif.jpeg .dwg.exr.FileWithNoExtension.vrlmap.sat.bak.ctb
que j'ai ensuite pu utiliser pour mon projet.
Pour lister toutes les extensions uniques de cmd sous le chemin que vous utilisez:
Powershell -Command "Get-ChildItem . -Include *.* -Recurse | Select-Object Extension | Sort-Object -Property Extension -Unique"