Comment “POUR le” travail dans cmd fichier batch?
J'ai été à la programmation dans des dizaines de langues pour 20 ans, mais je n'ai jamais pu comprendre comment "POUR le" travail dans windows cmd shell fichier de commandes, n'importe comment dur j'ai essayé. J'ai lu
http://www.ss64.com/nt/for.html
et plusieurs autres articles sur internet, mais encore confondre et ne peut pas accomplir quoi que ce soit.
Quelqu'un peut-il me donner une explication concise sur la façon de "POUR" les œuvres en général ?
Pour un peu plus spécifique à la question, comment puis-je itérer sur chaque chemin dans la variable %PATH%?
J'ai essayé avec
rem showpathenv.bat
for /f "delims=;" %%g in ("%PATH%") do echo %%g
Que montrer seulement le premier chemin, pas tous d'entre eux. Pourquoi ? Ce que je fais mal ?
- la accepté de répondre à ne manquer certains éléments importants de disponible pour la
for /f
boucle. Voir ma propre réponse... je pense qu'il est beaucoup plus proche de ce que vous avez demandé que Marc. Mais alors, je ne suis pas sûr à 100% de ce que vous avez demandé 😉 - Personne n'a répondu à votre question: "Pourquoi ? Ce que je fais mal ?' - Alors je vais essayer maintenant: Il vous montre seulement le premier chemin, parce que vous n'avez seulement demander. Il fonctionne comme prévu (je ne dis pas que la conception est bonne). Vous devez demander de plus, si vous souhaitez plus d'informations: après le " g "vient le" h " dans l'alphabet -- donc ajouter
echo %%h & echo %%i & echo %%j
de voir 3 autres répertoires de chemin. - et tokens=... C:\>for /f "tokens=1,2,3,4 delims=;" %g dans ("%PATH%") do echo %g %h %i
- souci de la réponse semble assez flexible, cependant, n'a pas besoin d'une longue liste de jetons, rend l'utilisation de la substitution (voir set /?), pour traiter le chemin.
Vous devez vous connecter pour publier un commentaire.
Aucune des réponses de travail. J'ai réussi à trouver la solution moi-même.
C'est un peu hackish, mais il résoudre le problème pour moi:
Oh ! Je déteste le fichier de commandes de programmation !!
Mis à jour
Marque de la solution est plus simple, mais il ne fonctionnera pas avec chemin d'accès contenant des espaces. C'est un peu une version modifiée de la Marque, solution de
Marque l'idée était bonne, mais peut-être oublié un chemin que les espaces. Remplacer"; " par """' au lieu de cela couperait tous les chemins dans les chaînes entre guillemets.
Donc, ici, vous avez votre chemins affiche.
DE commande dans le cmd a un fastidieux de la courbe d'apprentissage, notamment en raison de la manière dont les variables de réagir dans les ()'s états... vous pouvez affecter des variables, mais vous ne pouvez pas le lire, puis de retour au sein de la ()'s, sauf si vous utilisez le "setlocal ENABLEDELAYEDEXPANSION" déclaration, et donc aussi utiliser les variables avec !!'s au lieu de %%s' (!_var!)
Je suis actuellement exclusivement script avec cmd, pour le travail, a dû apprendre tout ça 🙂
do
permettra de s'assurer que la commande n'a pas d'écho à la ligne de commande. Et si vous changezecho %%~p
àecho.%%~p
, vous pouvez éliminer les "si ce n'est de la partie. Par conséquent, la deuxième commande peut être raccourcie àfor %%p in (%_path%) do @echo.%%~p
Vous avez eu la bonne idée, mais
for /f
est conçu pour fonctionner sur plusieurs lignes de fichiers ou des commandes, et non les chaînes.Dans sa forme la plus simple,
for
est comme Perlfor
, ou toute autre langue de l'foreach
. Vous transmettre une liste de jetons, et il passe en revue, en les appelant de la même commande à chaque fois.Les extensions n'automatique des moyens d'établissement de la liste des jetons. La raison de votre code actuel est à venir avec rien, est que "les
;
" est la valeur par défaut de fin de ligne (commentaire) symbole. Mais même si vous changer cela, vous devez utiliser le%%g, %%h, %%i, ...
à l'accès individuel des jetons, ce qui permettra de limiter considérablement votre fichier de commandes.Le plus proche que vous pouvez obtenir ce que vous demandez est:
Mais qui ne manquera pas de de cité les chemins qui contiennent des points-virgules.
Dans mon expérience,
for /l
etfor /r
sont bons pour l'extension des commandes existantes, mais sinonfor
est extrêmement limitée. Vous pouvez la rendre un peu plus puissante (et la confusion) avec l'expansion retardée de variables (cmd /v:on
), mais c'est vraiment bon pour les listes de noms de fichiers.Je vous suggère de l'aide WSH ou PowerShell si vous avez besoin pour effectuer la manipulation de la chaîne. Si vous essayez d'écrire
whereis
pour Windows, essayezwhere /?
.for /f
[...] pas des chaînes'. Mon exemple à partir d'aujourd'hui montre comment vous pouvez disséquer un individu de la chaîne, tant qu'il est utilisable séparateurs à l'intérieur.Ne pouvais pas résister à jeter ce vieux que ce fil est... Généralement quand le besoin s'en fait sentir pour itérer sur chacun des fichiers dans le CHEMIN, tout ce que vous voulez vraiment faire est de trouver un fichier en particulier... Si c'est le cas, ce one-liner va cracher le premier répertoire, il trouve votre fichier dans:
(ex: à la recherche d'java.exe)
Je sais que c'est SUPER vieux... mais juste pour le fun, j'ai décidé de donner à ceci un essai:
Cela ne nécessite pas un nombre et ira jusqu'à la fin. J'ai eu le même problème avec les espaces), mais il fait grâce à l'ensemble de la variable. La clé, c'est la boucle étiquettes et de la
SHIFT
fonction.for /f
itère par ligne d'entrée, dans votre programme n'sortie du premier chemin.votre programme traite l' %PATH% une ligne d'entrée, et deliminate par
;
, mettre en premier résultat à %%g, alors la sortie de %%g (première deliminated chemin d'accès).FOR
est essentiellement une itération sur les "lignes" dans l'ensemble de données. Dans ce cas, il y a une ligne qui contient le chemin d'accès. Le"delims=;"
est juste pour lui dire de se séparer des points-virgules. Si vous modifiez le corps deecho %%g,%%h,%%i,%%j,%%k
vous verrez que c'est le traitement de l'entrée sur une seule ligne, et de le casser en plusieurs jetons.Cela fonctionne pour moi:
Vous devez en outre utiliser le
tokens=1,2,...
partie des options que lefor
boucle permet. Ici vous ferez ce que vous voudrez:Cet exemple, les processus de la première 12 jetons (=répertoires de la variable %path%) seulement. Il utilise explicite de l'énumération de chacune des jetons. Notez que le jeton noms sont sensibles à la casse: %a est différent de %A.
À enregistrer pour les chemins avec des espaces, surround tous %x avec des guillemets comme ceci "%i". Je ne l'ai pas fait ici, là où je ne suis en écho à l'jetons.
Vous pouvez également faire de s.th. comme ceci:
Ce un saute jetons 2,4,6 et utilise un peu raccourci ("
7-26
") pour nommer le reste d'entre eux. Notez combien de %c, %b, %sont traitées dans l'ordre inverse cette fois, et comment ils ont maintenant un 'moyen' jetons différents, par rapport au premier exemple.Donc, ce n'est sûrement pas l'explication concise que vous avez demandé. Mais peut-être les exemples les aider à clarifier un peu mieux maintenant...
for
boucle dans ce contexte, les fractionnements de l'entrée ("%PATH%
") dans les différentes lignes. Les jetons de diviser chaque ligne en différents morceaux (limites dépendent de la délimiteurs). Maintenant, dans notre cas, nous avons seulement 1 seule ligne de saisie. (Mais la boucle serait de travailler avec de multiples lignes de la même manière.) Nous utilisons pour la boucle, parce que nous n'avons pas d'autres moyens pour séparer les lignes (soit un seul, ou plusieurs petits) en morceaux.Ici est un bon guide:
FOR /F - Boucle de commande: en fonction d'un ensemble de fichiers.
FOR /F - Boucle de commande: contre les résultats d'une autre commande.
POUR la Boucle de commande: toutes les options de Fichiers, de répertoires, Liste.
[Le guide complet (Windows XP commandes):
http://www.ss64.com/nt/index.html
Edit: Désolé, ne pas voir que le lien était déjà dans l'OP, il m'est apparu comme une partie de l'Amazonie lien.
Cela fonctionne pour moi, l'essayer.
Cela fonctionne pour moi, l'essayer.
for /f "tokens=* delims=;" %g dans ('echo %PATH%') do echo %g%