2010-04-23 4 views
4

J'essaie de créer un fichier contenant une liste de répertoires contenant un nom de fichier spécifique.Fichier de commandes Windows pour lister les dossiers contenant un fichier spécifique

Supposons que j'essaie de trouver des répertoires contenant un fichier nommé *.joe. J'ai d'abord essayé juste un simple dir /ad *.joe > dir_list.txt, mais il recherche les noms de répertoire pour *.joe, donc pas d'aller. Puis j'ai conclu qu'une boucle for était probablement mon meilleur pari. J'ai commencé avec

for /d /r %a in ('dir *.joe /b') do @echo %a >> dir_list.txt 

et il semblait qu'il n'exécutait pas la commande dir. J'ai ajouté le "usebackq", mais cela semble fonctionner seulement pour l'extension de commande/F.

Des idées?

Répondre

0

dir /s/b *.joe >> dir_list.txt puis un skript dans par ex. GAWK pour se débarrasser des noms de fichiers après les dirnames

4

Depuis « dir /s /b file_name » ne coupe pas, comment sur les points suivants

for /d /r %a in (*) do @if exist %a\*.scr (echo %a) 

Il semblerait que dans un fichier batch la seule chose qui doit être esaped est le% de donner

for /d /r %%a in (*) do @if exist %%a\*.scr (echo %%a) 
+0

Pas * exactement * ce qu'il recherche, mais +1 parce que c'est de loin la solution la plus simple au problème. Un simple REPLACE ("nom_fichier", "") par la suite vous donnera la sortie désirée - un moyen de le faire dans un fichier BAT? – SqlRyan

+0

Je l'utilisais avant que je réalise que j'avais juste besoin de noms de répertoires et non de noms de fichiers; C'est alors que j'ai commencé à expérimenter avec le dir/ad et que je suis tombé en spirale à partir de là ... – Lee

+0

@Lee: Merci d'avoir shaing votre descente de spriral avec moi;) J'espère que mon edit ci-dessus l'achèvera. – torak

1

Enregistrer ce à search.bat ou (autre chose que vous pouvez rappeler)

@echo off 
setlocal EnableDelayedExpansion 
set last=? 

if "%1" EQU "" goto usage 

for /f %%I in ('dir /s /b /o:n /a-d "%1"') do (
    if !last! NEQ %%~dpI ( 
    set last=%%~dpI 
    echo !last! 
) 
) 
goto end 

:usage 
echo Please give search parameter. 

:end 

et utiliser comme suit:

search.bat *.joe >dir_list.txt 

Notez qu'il recherche dans le contexte de chemin actuel. Vous voudrez peut-être ajouter le .bat à un emplacement situé dans le PATH, afin que vous puissiez l'appeler à partir de n'importe quel endroit.

+1

Cela fonctionne - mais je n'ai aucune idée de ce qu'il fait – Lee

+0

@Lee: C'est une boucle 'for' sur chaque ligne que la commande' dir' renvoie, La partie doit être claire, puis elle utilise la variable 'last' pour comparer chaque ligne avec celle d'avant.Quand ils diffèrent, il imprime la ligne. De cette façon, seules les lignes uniques sont imprimées. Lisez 'for /?' Pour savoir ce que signifie '% ~ dpI'. Recherchez StackOverflow ou Google pour ce que 'EnableDelayedExpansion' signifie. ;) – Tomalak

1

Cela affichera le répertoire et le nom du fichier, peut ou peut ne pas être utile pour vous:

dir /b /s | findstr "\.joe" 

findstr utilise une expression rationnelle.

Questions connexes