Cómo funciona este comando de Windows: echo% path:; = & echo.%

Respuestas:

22

Esa es una solución interesante que nunca he visto antes. Déjame intentar explicar:

  1. Para imprimir la ruta completa, use echo %path%. Esto imprimirá todos los directorios en una sola línea separada con punto y coma ( ;)
  2. Para buscar / reemplazar una cadena en una variable, use %path:a=b%cual reemplazará todos los acaracteres conb
  3. echo. se usa para imprimir una nueva línea
  4. &se usa para separar comandos, por ejemplo echo line1&echo line2, imprimirá dos líneas
  5. En efecto, los puntos y comas en la ruta se reemplazan con un comando para imprimir una nueva línea. O tal vez se interpreta como 'reemplazar ;con nada, y luego imprimir una nueva línea'. No puedo encontrar ninguna documentación sobre esto, así que es solo mi interpretación. Francamente, ni siquiera sabía que eso era posible, pero ahí lo tienes. ACTUALIZACIÓN Mi interpretación de este paso parece estar apagada, y wizzwizz4 lo explica mejor .
Berend
fuente
¿para qué se usan los signos %% echo path? ¿Se utiliza %% para las variables?
yekanchi
1
Sí, eso es correcto, se usan para obtener el valor de una variable. Por ejemplo: set greeting=Helloy luego echo %greeting%. Confusamente, PATHresulta ser tanto un comando como una variable, por lo que escribir el comando patho echo %path%tendrá el mismo resultado.
Berend
¿Cómo se llama esta sintaxis? es regex? o algo utilizado solo en Windows CMD
yekanchi
No estoy seguro de si hay un nombre para esto, es solo la forma en que las variables funcionan en DOS. Otros lenguajes, como bash, se usan $PATHpor ejemplo.
Berend
2
Esto no tiene nada que ver con DOS, Berend; y echo.no es "el comando para imprimir una nueva línea". Este es el intérprete de comandos de Microsoft para Windows NT cmd; y echo.simplemente es el comando para imprimir un elemento de ruta asegurando que si el elemento de ruta está vacío, no cambie a la otra funcionalidad deecho . El primero echorealmente debería ser un echo.también.
JdeBP
30

Esto está utilizando la sustitución de variables de línea de comandos. %path:;=&echo.%significa " %path%, pero reemplaza todas las ;s con &echo.". Esto significa que, con set path=C:\Windows\System32;C:\Windows\;;C:\Python37;:

echo %path:;=&echo.%

se convierte en:

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

Como &es un separador de comandos, esto es equivalente a:

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

Debido a las peculiaridades de DOS Batch, echo.es idéntico, echo excepto cuando no hay nada después. Si ese es el caso, simplemente no imprime nada, en lugar de decirle si ECHOestá activado o desactivado. Esto hará que la salida:

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

C:\Python37

C:\Users\wizzwizz4> 

Realmente, debería ser echo.%path:;=&echo.%para tener en cuenta el caso donde %PATH%comienza con a ;, pero este comando es bastante inteligente de todos modos.


Entrar en detalles detalias, realmente echo( debería usarse en lugar de echo.. Esto se debe a que echo.puede tener problemas cuando se llama un archivo echoy es lento porque tiene que verificar el disco ( %CD%y creo que también todo %PATH%) cada vez que se ejecuta. (No tengo una copia de Windows, así que no puedo verificarlo yo mismo; ¿es solo %CD%en cualquier lugar %PATH%que la presencia del echoarchivo afecte echo.y qué hace?)

wizzwizz4
fuente
Este es un comportamiento de larga data de los intérpretes de comandos de Microsoft / IBM en varios sistemas operativos y no es específico de los scripts por lotes. Como señalé en superuser.com/a/310157/38062 hace años, hay varios caracteres de puntuación además del espacio en blanco que cuentan como caracteres de terminación de nombre de comando.
JdeBP
@JdeBP Creo que uno de los más eficientes es echo), pero realmente no lo recuerdo. ;-(
wizzwizz4
3
echo.es el que solía circular la gente hace años. Es el único en muchos libros. La eficiencia no es el problema. El comportamiento extraño cuando existen varios archivos es. Cuando escribí un reemplazo de 32 bits para 16 bits cmden OS / 2, romper los nombres de los comandos en estos caracteres de puntuación y este comportamiento de análisis altamente irregular es una de las cosas que deliberadamente no dupliqué, y que puse en el documento documentado lista de diferencias En su echodotlugar, hice un comando externo , cuál podría alias según echo.lo deseado.
JdeBP
@JdeBP ¡Eso suena realmente interesante! ¿Crees que podrías documentar algo de eso ?
wizzwizz4
Si sigue varios enlaces de comentarios, termina en un mensaje de foro de terceros que dice que echo(es la única versión segura.
Neil