web-dev-qa-db-fra.com

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

La recherche d'une solution pour imprimer des chemins dans la variable path dans la ligne de commande windows est arrivée dans this solution. la réponse est cette commande:

echo %path:;=&echo.%

maintenant, je me demande comment cela fonctionne.

23
yekanchi

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

  1. Pour imprimer le chemin complet, utilisez echo %path%. Ceci imprimera tous les répertoires sur une seule ligne, séparés par des points-virgules (;)
  2. Pour rechercher/remplacer une chaîne dans une variable, utilisez %path:a=b% qui remplacera tous les caractères a par b
  3. echo. est utilisé pour imprimer une nouvelle ligne
  4. & est utilisé pour séparer les commandes, par exemple echo line1&echo line2 imprimera deux lignes
  5. En effet, les points-virgules du chemin sont remplacés par un commande pour imprimer une nouvelle ligne. Ou peut-être est-il interprété comme 'remplacer ; par rien, puis, imprimer une nouvelle ligne'. Je ne trouve aucune documentation à ce sujet, c'est donc mon interprétation. Franchement, je ne savais même pas que c'était possible, mais voilà.UPDATEMon interprétation de cette étape semble être erronée et est mieux expliquée par wizzwizz4 .
22
Berend

Ceci utilise la substitution de variable en ligne de commande. %path:;=&echo.% signifie "%path%, mais remplace tout ;s par &echo.". Cela signifie que, 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.

Puisque & est un séparateur de commande, cela équivaut à:

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

En raison des particularités de DOS Batch, echo. est identique à echo sauf lorsqu'il n'y a rien après. Si c'est le cas, rien ne sera simplement imprimé, au lieu de vous indiquer si ECHO est activé ou non. Cela fera la sortie:

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

C:\Python37

C:\Users\wizzwizz4> 

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


Pour entrer dans les detalias détaillés, vraiment echo( devrait être utilisé à la place de echo.. Ceci est dû au fait 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 les %PATH%) à chaque exécution. (Je n'ai pas de copie de Windows et je ne peux donc pas le vérifier moi-même; est-ce juste %CD% ou ailleurs dans le %PATH% que la présence du fichier echo affectera echo. et que fera-t-il?)

30
wizzwizz4