2009-08-18 7 views
0

j'ai un répertoire qui contient les éléments suivants:Lot/CMD: Recherche sur tous les fichiers de dossier unique meta.xml

-directory 
-another directory 
    -meta.xml 
-yet another directory 
    -meta.xml 
... 

Il doit trouver dans chaque répertoire « meta.xml », par lui-même (de sorte que je n'ai pas à taper dans chaque répertoire au code) Et je veux qu'avec CHAQUE fichier meta.xml une commande est faite. Y a-t-il une façon possible de faire cela, et cela pourrait-il être fait parce que la commande dont je parlais donne une ligne de texte à partir de ce fichier meta.xml, et je ne voudrais pas voir ce que ça fait, que vous obtenir quelque chose comme ceci:

text from meta file 1 
text from meta file 2 
text from meta file 3 

et non

meta.xml found 
text from meta file 1 
meta.xml found 
text from meta file 2 
meta.xml found 
text from meta file 3 

Si c'est pas clair, il suffit de penser que je voudrais juste aimer courir tranquillement, ok. (?/Q peut-être)

est la commande dont je parlais:

findstr "<name>" meta.xml >temp1.lis 
FOR /F "tokens=2 delims=>" %%i in (temp1.lis) do @echo %%i > temp2.lis 
FOR /F "tokens=1 delims=<" %%i in (temp2.lis) do @echo %%i > temp3.lis 

il a besoin de faire cela pour chaque fichier meta.xml et donnant la sortie de sorte que vous obtenez une liste complète lorsque vous faire

type temp3.lis 

Merci!

Répondre

2

Ok, pour autant que je peux dire, cela devrait fonctionner:

findmeta.cmd

@echo off 
for /f "delims=" %%f in ('dir /b /s meta.xml') do (
    FOR /F "tokens=2 delims=>" %%i in ('findstr "<name>" %%f') do @echo %%i > temp2.lis 
    FOR /F "tokens=1 delims=<" %%i in (temp2.lis) do @echo %%i >> temp3.lis 
) 

J'ai modifié votre partie de script pour les réponses sont ajoutées à temp3.lis, au lieu de remplacer et supprime l'utilisation du premier fichier temporaire.

Si, à la fin, ce que vous cherchez est ce qui est toujours entre les balises, comme
<name> blahblah </name> (la blahblah partie)

cela devrait faire encore plus vite , aucun fichier temporaire nécessaire et un de moins boucle (ont fait irruption dans plusieurs lignes pour faciliter la lecture, tout tenir sur une seule ligne en cas de besoin.

for /f "delims=" %%f in ('dir /b /s meta.xml') do (
    FOR /F "tokens=2 delims=><" %%i in ('findstr "<name>" %%f') do (
     @echo %%i >> temp3.lis 
    ) 
) 

version en ligne simple:

for /f "delims=" %%f in ('dir /b /s meta.xml') do FOR /F "tokens=2 delims=><" %%i in ('findstr "<name>" %%f') do @echo %%i >> temp3.lis 

Je ne sais pas ce que vous préférez, SI c'est ce que vous cherchez.

EDIT: Ok
Je pense que je l'ai, mais je ne suis pas sûr que ça va tout résoudre. Fondamentalement, vous voulez changer les jetons = 2 à jetons = 3 comme ceci:

for /f "delims=" %%f in ('dir /b /s meta.xml') do FOR /F "tokens=3 delims=><" %%i in ('findstr "<name>" %%f') do @echo %%i >> temp3.lis 

maintenant voir si cela fonctionne.

+0

merci, je vais essayer quand je suis de retour à la maison. Je ne suis pas à la maison en ce moment. –

+0

ne fonctionne pas, pour 2 fichiers meta.xml il est dit beaucoup de'name's –

+0

Hmm dont l'un des 3 snipets ne fonctionne pas? Avez-vous essayé tous les? Aussi, pouvez-vous poster une partie du XML que vous voulez traiter, afin que nous ayons une vision plus claire de la tâche à accomplir? – Jay

0
findstr /r /s ".*" meta.xml 

vous donnera toutes les lignes de chaque fichier meta.xml dans le répertoire courant et tous ses sous-répertoires, sous la forme:

dir1\dir2\dir2\meta.xml: line is here. 

Si vous avez besoin quelque chose de plus complexe, je vous suggère d'installer outils Cygwin ou GNU et en utilisant le shell bash ou utilitaires de type UNIX de cela, quelque chose comme:

find . -name meta.xml -exec cat {} ';' 
+0

i comme le premier, mais le problème est que je ne veux pas chaque ligne. Y at-il un moyen que je peux mettre ma propre commande (voir mon post édité) dans findstr? –

+0

Si vous ne voulez pas toutes les lignes, fournissez simplement un terme de recherche plus spécifique. Que diriez-vous ce> findstr/r/s "tokens-. Delims =" meta.xml – Glen

+1

@YourComputerHelpZ. command.com/cmd.exe a parcouru un long chemin depuis les mauvais vieux jours MSDOS mais c'est toujours un mauvais cousin de bash (ou ksh). La suggestion d'utiliser Cygwin serait ma préférence - elle vous donne vraiment un * beaucoup * plus de puissance expressive. – paxdiablo

0

Pour trouver tous les fichiers mETA.xml:

dir meta.xml /s 

Ensuite, vous pouvez diriger la sortie vers une autre commande comme

dir meta.xml /s | someCommand 
+0

le second semble super, comment puis-je remplacer «SomeCommand» avec plus de lignes de code? –

+0

ne fonctionne pas, continue de me donner 'FINDSTR: meta.xml introuvable'. je voulais dire qu'il devrait chercher tous les dirs pour cuvette ... il –

+0

* subdirs je veux dire –

0

Je ne suis pas tout à fait sûr si je comprends bien ce que vous voulez. Vous voulez trouver tous les fichiers nommés méta.xml, mais voulez-vous rechercher quelque chose dans ce fichier ou voulez-vous voir le contenu complet de ce fichier? Et vous voulez filtrer toute sortie concernant le nom des fichiers trouvés, vous êtes seulement intéressé par le contenu des fichiers, non?

Je ne sais pas si cela est possible de le faire avec cmd, mais si vous installez cygwin vous pouvez facilement le faire de la manière suivante:

prompt>find top_level_directory -name meta.xml -print0 | xargs -0 grep -h "your search pattern" 

pour la recherche ou

prompt>find top_level_directory -name meta.xml -print0 | xargs -0 cat 

pour la sortie le fichier complet.

+0

Je ne veux pas utiliser d'outils de ligne de commande supplémentaires, parce que c'est public. –

+0

ok, um ... pourrait-il y avoir une combinaison avec ma commande? Peut-être que cygwin pourrait aussi faire ce que je veux accomplir? –