Fonctionnement de cette commande Windows: echo% path:; = & echo.%

23

La recherche d'une solution pour imprimer les chemins à l'intérieur des pathvariables dans la ligne de commande Windows est arrivée à cette solution. la réponse est cette commande:

echo %path:;=&echo.%

maintenant je me demande comment ça marche.

yekanchi
la source

Réponses:

22

C'est une solution intéressante que je n'ai jamais vue auparavant. Permettez-moi d'essayer d'expliquer:

  1. Pour imprimer l'intégralité du chemin, utilisez echo %path%. Cela affichera tous les répertoires sur une seule ligne séparée par des points-virgules ( ;)
  2. Pour rechercher / remplacer une chaîne dans une variable, utilisez %path:a=b%qui remplacera tous les acaractères parb
  3. echo. est utilisé pour imprimer une nouvelle ligne
  4. &est utilisé pour séparer les commandes, par exemple echo line1&echo line2imprime deux lignes
  5. En effet, les points-virgules dans le chemin d'accès sont remplacés par une commande pour imprimer une nouvelle ligne. Ou peut-être que cela est interprété comme «remplacer ;par rien, puis imprimer une nouvelle ligne». Je ne trouve aucune documentation à ce sujet, c'est juste mon interprétation. Franchement, je ne savais même pas que c'était possible, mais voilà. MISE À JOUR Mon interprétation de cette étape semble être fausse et est mieux expliquée par wizzwizz4 .
Berend
la source
à quoi servent les signes %%, ne pouvons-nous pas le dire echo path? %% est-il utilisé pour les variables?
yekanchi
1
Oui, c'est exact, ceux-ci sont utilisés pour obtenir la valeur d'une variable. Par exemple: set greeting=Helloet ensuite echo %greeting%. Confusément, PATHse trouve être à la fois une commande et une variable, donc taper la commande path, ou echo %path%aura le même résultat.
Berend
comment s'appelle cette syntaxe? est-ce regex? ou quelque chose utilisé dans Windows CMD uniquement
yekanchi
Je ne sais pas s'il y a un nom pour cela, c'est juste la façon dont les variables fonctionnent sous DOS. D'autres langues, comme bash, utilisent $PATHpar exemple.
Berend
2
Cela n'a rien à voir avec DOS, Berend; et echo.n'est pas "la commande pour imprimer une nouvelle ligne". Ceci est l'interpréteur de commandes de Microsoft pour Windows NT, cmd; et echo.est simplement la commande pour imprimer un élément path en s'assurant que si l'élément path est vide, il ne passe pas à l' autre fonctionnalité deecho . Le premier echodevrait vraiment être un echo.trop.
JdeBP
30

Ceci utilise la substitution de variable en ligne de commande. %path:;=&echo.%signifie " %path%, mais remplacez tous les ;s par &echo.". Cela signifie qu'avec set path=C:\Windows\System32;C:\Windows\;;C:\Python37;:

echo %path:;=&echo.%

devient:

echo C:\Windows\System32&echo.C:\Windows\&echo.&echo.C:\Python37&echo.

Étant donné qu'il &s'agit d'un séparateur de commandes, cela équivaut à:

echo C:\Windows\System32
echo.C:\Windows\
echo.
echo.C:\Python37
echo.

En raison des caprices de DOS Batch, echo.est identique à echo sauf quand il n'y a rien après. Si tel est le cas, il n'imprime simplement rien, au lieu de vous dire s'il ECHOest activé ou désactivé. Cela rendra la sortie:

C:\Users\wizzwizz4> echo %path:;&echo.%
C:\Windows\System32
C:\Windows\

C:\Python37

C:\Users\wizzwizz4> 

Vraiment, cela devrait être echo.%path:;=&echo.%pour tenir compte du cas où %PATH%commence par un ;, mais cette commande est quand même assez intelligente.


Entrer dans des détails détaillés, devrait vraiment echo( être utilisé à la place de echo.. C'est parce que echo.peut avoir des problèmes lorsque vous avez un fichier appelé echo, et est lent car il doit vérifier le disque ( %CD%et je pense aussi tous %PATH%) à chaque fois qu'il s'exécute. (Je n'ai pas de copie de Windows, je ne peux donc pas le vérifier moi-même; est-ce juste %CD%ou n'importe où dans %PATH%le echofichier que la présence du fichier affectera echo., et que fait-il?)

wizzwizz4
la source
Il s'agit d'un comportement de longue date des interpréteurs de commandes Microsoft / IBM sur plusieurs systèmes d'exploitation et il n'est pas spécifique aux scripts de commandes. Comme je l'ai noté sur superuser.com/a/310157/38062 il y a des années, il y a plusieurs caractères de ponctuation en plus des espaces qui comptent comme des caractères de terminaison de nom de commande.
JdeBP
@JdeBP Je pense que l'un des plus efficaces est echo), mais je ne m'en souviens pas vraiment. ;-(
wizzwizz4
3
echo.est celui que les gens circulaient le plus il y a des années. C'est celui de nombreux livres. L'efficacité n'est pas le problème. Comportement loufoque lorsque divers fichiers existent. Lorsque j'ai écrit un remplacement 32 bits pour le 16 bits cmddans OS / 2, la rupture des noms de commande à ces caractères de ponctuation et ce comportement d'analyse très irrégulier est l'une des choses que je n'ai pas délibérément dupliqué et que j'ai mis sur le documenté liste des différences. J'ai echodotplutôt fait une commande externe , que l'on pourrait alias comme on echo.le souhaite.
JdeBP
@JdeBP Cela semble vraiment intéressant! Pensez-vous que vous pourriez documenter une partie de cela ?
wizzwizz4
Si vous suivez divers liens de commentaires, vous vous retrouvez sur un message de forum tiers qui echo(est la seule version sûre.
Neil