0
votes

Boucle via des fichiers avec une extension prend également les prochaines lettres

Par exemple, au lieu d'obtenir uniquement des fichiers .MID, je reçois aussi un fichier .Midi et je veux éviter ceci:

 Entrez la description de l'image ici

Si possible, je voudrais éviter d'utiliser une condition si dans la déclaration DO.
Je dois utiliser cette boucle simple car elle ne vélore pas dans les sous-dossiers et c'est le comportement que je veux.


2 commentaires

MIDI Les fichiers ont un nom abrégé de .mid . Donc, ils correspondront à une fauve de fichier de *. Mid . Il suffit d'ajouter un chèque pour% i in (* .mid) do @IF non% ~ xi = .Midi echo% i .


Veuillez afficher votre ligne de commande ainsi que votre texte de texte sous forme de texte plutôt que comme une image de Modifier intim de votre message!


3 Réponses :


2
votes

Malheureusement, la plupart des commandes traitent *. ext comme toute poste commençant par .ext de sorte que vous l'avez vu, qui inclurait, extn < / Code> aussi:

Vous pouvez donc modifier cette première ligne à la sur: xxx

ou: xxx

vous pouviez Utilisez également une commande qui traite l'extension correctement, où.exe : xxx

d'un vous doubleriez le % caractères.


7 commentaires

Pour / f "delims ="% i in ("où * .mid ') do @echo% ~ nxi


Pour / f "jetons = *"% i in ('where * .mid') @echo% ~ nxi


Ce n'est pas la même chose, si vous n'utilisez pas . comme le répertoire actuel, il recherchera ailleurs, (dans les répertoires répertoriés sous % path % ) . Il arrive tellement que vous n'avez actuellement aucun fichier .mid de fichiers, ne constatez pas la différence .


"Ouvrez une fenêtre d'invite de commande, CD sur"% UserProfile% \ Desktop ", puis entrez, CD.> Test DLL, (cela créera un fichier test.dll vide sur votre bureau). Entrez maintenant où.: *. DLL, et notez la sortie, faites maintenant la même chose mais en utilisant où * .dll. Le seul moyen que vous auriez une sortie correspondante serait si, vous n'avez pas eu les entrées par défaut dans votre% de path%. " Wtf! : -O tu as raison! Comportement étrange.


Pourquoi est-il nécessaire de spécifier l'option EOL?


Après une journée complète de tests, j'ai finalement découvert que la solution dans votre réponse est la meilleure: pour / felims ^ = ^ eol ^ =% A In ('Où.: *. Mid 2 ^> Nul') do @echo% ~ nxa


Dans ce cas particulier, il ne devrait pas être nécessaire de stipuler un eol , c'est plus une habitude. Généralement, un pour boucle, utilise une erreur par défaut eol d'un point-virgule, ; , cela signifie que toute chaîne retournée en commençant par une est exclu de la sortie. sortira les chaînes résultantes en tant que chemins de fichiers complets, ce qui signifie que tout devrait commencer par une lettre, a - z . Donc, vous pouvez simplement utiliser "delims =" à la place. Vous pouvez essayer "jetons = *" , et il doit fonctionner aussi bien dans ce cas, car toutes les chaînes ne finiront pas non plus avec un espace ou une onglet, (ils finiront tous .mid ) .



2
votes
for /f %i in ( ' dir /b *.mid^|findstr /e /i /L /c:".mid" ' ) do @echo %i
not simple, but avoids the if statement. A simple dir filtered by findstr to find lines that /e end with /i case-insensitive, /L literal /c: constant string."doesn't even" implies that you actually want to scan subdirectories. To do that, add the /s switch to the dir command. Also might be advisable to add /on to the dir command to cater for FAT filesystems.

1 commentaires

Je dois utiliser cette simple boucle car elle ne fait pas de vélo dans les sous-dossiers et c'est le comportement que je veux.



0
votes

Voici la solution: xxx pré>

pour plus de fichiers: p> xxx pré>

ou (syntaxe équivalente) p>

FOR /F "delims= eol=" %i IN ('WHERE "%Path1%:*.exe" "%Path2%:*.dll" 2^> NUL') DO @ECHO %~nxi


6 commentaires

Vous n'avez pas demandé une fonction récursive dans votre question, il n'était donc pas nécessaire de l'inclure dans votre réponse, surtout compte tenu de votre commentaire ci-dessous la réponse de Magoo . De plus, comme je l'ai commenté en réponse à votre réponse sous ma réponse, ignorez le . , car le répertoire actuel n'est pas sage, Essayez-le avec un seul .dll fichier dans votre répertoire actuel, si vous ne me croyez pas . Ajout essentiellement votre réponse, n'a bénéficié personne et pris l'accent sur ma réponse déjà acceptée.


Dans "C: \ Windows", j'ai essayé avec un fichier dans le sous-dossier "System32" et n'a pas été trouvé: où ACPROXY.DLL. Au lieu de cela a été trouvé avec: où / r. acproxy.dll. J'utilise Windows 7.


En tout état de cause, votre conseil à utiliser le programme Où.exe est brillant et rend le code beaucoup plus simplifié. Merci beaucoup.


Ouvrez une fenêtre d'invite de commande, CD TO "% UserProfile% \ Desktop" puis entrez, CD.> Test DLL ( Ceci créera un fichier vide test.dll sur votre bureau) . Entrez maintenant où.: *. DLL et notez la sortie, faites maintenant la même chose, mais utilisez où * .dll . La seule façon dont vous auriez une sortie correspondante serait si, vous n'avez pas eu les entrées par défaut de votre % de path% .


TBF, si vous lisez la sortie de l'aide de la commande, où /? , si ma mémoire sert , il devrait stipuler ce comportement, (actuel répertoire et ceux-ci Chemin) , comme il s'agit d'emplacements de recherche par défaut. Stipulation évidemment un répertoire signifie que la valeur par défaut n'est plus utilisée.


"TBF, si vous lisez la sortie de l'aide de la commande, où /?, Si ma mémoire sert, il devrait stipuler ce comportement (répertoire actuel et celles-ci dans le chemin), car il s'agit d'emplacements de recherche par défaut. Stinpant évidemment un répertoire, signifie que cela signifie que La valeur par défaut n'est plus utilisée. ". J'ai lu l'aide, tu as raison! Merci pour tout!