Variable %PATH% de Windows 'Pretty print': cómo dividir en ';' en el shell CMD

Resuelto sam asked hace 13 años • 13 respuestas

Quiero ejecutar una línea simple en el indicador CMD de Windows para imprimir mi %PATH%variable, una entrada por línea.

Intenté esto: for /f "delims=;" %a in ("%path%") do echo %apero esto sólo imprime la primera entrada:

Z:\>for /f "delims=;" %a in ("%path%") do echo %a

Z:\>echo c:\python25\.
c:\python25\.

Además, como puede ver en el resultado anterior, esto también imprime el echo %acomando y el resultado. ¿Hay alguna manera de parar esto?

Si intento un comando similar, obtengo todas las entradas, pero aún obtengo el echo %aresultado enviando spam a los resultados. No entiendo por qué lo siguiente imprime todas las entradas, pero mi intento %PATH%no. Sospecho que no entiendo el /Fcambio.

Z:\>for %a in (1 2 3) do echo %a

Z:\>echo 1
1

Z:\>echo 2
2

Z:\>echo 3
3
sam avatar Mar 29 '11 18:03 sam
Aceptado

La forma sencilla es utilizar

for %a in ("%path:;=";"%") do @echo %~a

Esto funciona para todos sin ;en la ruta y sin "un solo elemento
Probado con path=C:\qt\4.6.3\bin;C:\Program Files;C:\documents & Settings

Pero una solución "siempre" es un poco complicada
EDITAR: ahora una variante funcional

@echo off
setlocal DisableDelayedExpansion
set "var=foo & bar;baz<>gak;"semi;colons;^&embedded";foo again!;throw (in) some (parentheses);"unmatched ;-)";(too"

set "var=%var:"=""%"
set "var=%var:^=^^%"
set "var=%var:&=^&%"
set "var=%var:|=^|%"
set "var=%var:<=^<%"
set "var=%var:>=^>%"

set "var=%var:;=^;^;%"
rem ** This is the key line, the missing quote is intended
set var=%var:""="%
set "var=%var:"=""%"

set "var=%var:;;="";""%"
set "var=%var:^;^;=;%"
set "var=%var:""="%"
set "var=%var:"=""%"
set "var=%var:"";""=";"%"
set "var=%var:"""="%"

setlocal EnableDelayedExpansion
for %%a in ("!var!") do (
    endlocal
    echo %%~a
    setlocal EnableDelayedExpansion
)

¿Qué hice allí?
Intenté resolver el problema principal: que los puntos y comas dentro de las comillas deberían ignorarse y solo los puntos y comas normales deberían reemplazarse con";"

Utilicé el intérprete por lotes para resolver esto por mí.

  • Primero tengo que hacer que la cadena sea segura , escapando de todos los caracteres especiales.
  • Luego todos ;son reemplazados por^;^;
  • y luego el truco comienza con la línea
    set var=%var:"=""%"(¡La cita que falta es la clave!).
    Esto se expande de tal manera que todos los caracteres escapados perderán su cursor de escape:
    var=foo & bar;;baz<>gak;;"semi^;^;colons^;^;^&embedded";;foo again!;;...
    Pero solo fuera de las comillas , por lo que ahora hay una diferencia entre punto y coma fuera de las comillas ;;y dentro ^;^;.
    Esa es la clave.
jeb avatar Mar 29 '2011 12:03 jeb

Una simple línea para embellecer la impresión de la PATHvariable de entorno:

ECHO.%PATH:;= & ECHO.%

Si PATHera igual a A;B;Cla cadena anterior, la sustitución cambiará esto ECHO.A & ECHO.B & ECHO.Cy lo ejecutará todo de una vez. El punto evita que aparezcan los mensajes "ECHO está activado".

Stephen Quan avatar Apr 29 '2014 01:04 Stephen Quan

Una actualización de la muy inteligente solución de una sola línea de Stephan Quan: El problema que encontré fue que un punto y coma al final (y tal vez dos puntos y coma sucesivos, es decir, un elemento de ruta vacío) provocaría que apareciera el mensaje "ECHO está activado". Resolví esto insertando un punto inmediatamente después de la segunda declaración ECHO (que es la sintaxis para suprimir mensajes ECHO activados/desactivados). Sin embargo, resultará en una línea vacía adicional:

ECHO %PATH:;= & ECHO.%
user1998693 avatar Jun 11 '2014 16:06 user1998693