‘Pretty print’ variable windows% PATH% – cómo dividir en ‘;’ en CMD shell

Quiero ejecutar un simple un-liner en el prompt de Windows CMD para imprimir mi %PATH% , una entrada por línea.

Intenté esto: for /f "delims=;" %a in ("%path%") do echo %a for /f "delims=;" %a in ("%path%") do echo %a pero esto solo imprime la primera entrada:

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

También como puede ver en el resultado anterior, esto también está imprimiendo el comando echo %a así como la salida. ¿Hay alguna manera de parar esto?

Si bash un comando similar, obtengo todas las entradas, pero todavía obtengo el echo %a salida que envía los resultados. No entiendo por qué el siguiente imprime todas las entradas, pero mi bash de %PATH% no lo hace. Sospecho que no entiendo el /F

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

La manera simple es usar

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

Esto funciona para todos sin ; en el camino y sin " alrededor de un solo elemento
Probado con path = C: \ qt \ 4.6.3 \ bin; C: \ Archivos de progtwig; C: \ documents & Settings

Pero una solución “siempre” es un poco complicada
EDITAR: ahora una variante de trabajo

 @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í?
Traté de 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 por ";"

Usé 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.
  • Entonces todo ; son reemplazados por ^;^;
  • y luego el truco comienza con la línea
    set var=%var:"=""%" (¡La cita faltante es la clave!).
    Esto se expande de forma tal que todos los personajes que escapen perderán su caret de escape:
    var=foo & bar;;baz<>gak;;"semi^;^;colons^;^;^&embedded";;foo again!;;
    Pero solo fuera de las comillas , entonces ahora hay una diferencia entre punto y coma fuera de las comillas ;; y adentro ^;^; .
    Esa es la clave.

Un simple trazador de líneas para la impresión de Prettying la PATH entorno PATH :

 ECHO.%PATH:;= & ECHO.% 

Si su PATH fue igual a A;B;C la sustitución de la cadena anterior cambiará esto a ECHO.A & ECHO.B & ECHO.C y lo ejecutará todo de una vez. La parada completa evita que aparezcan los mensajes “ECHO encendido”.

Tengo pequeñas mejoras en la inteligente solución “siempre” de jeb. Actualmente la solución de jeb tiene los siguientes problemas:

  1. Si la ruta principal está entre comillas, la primera salida comienza con “”
  2. Si la ruta final está entre comillas, la última salida finaliza con “”
  3. Si alguna ruta contiene “” inofensivo pero no funcional “”, entonces la salida conserva el “”
  4. Si var contiene consecutiva ;; delimitadores luego salidas ECHO está apagado

Esta solución soluciona los problemas menores, además de que usa 2 sustituciones menos. También eliminé la innecesaria repetición de habilitar / deshabilitar la expansión retardada dentro del ciclo. (Editar en 2011-10-30 simplificó la lógica ENDLOCAL)

 @echo off setlocal DisableDelayedExpansion set "var=%var:"=""%" set "var=%var:^=^^%" set "var=%var:&=^&%" set "var=%var:|=^|%" set "var=%var:< =^<%" set "var=%var:>=^>%" set "var=%var:;=^;^;%" set var=%var:""="% set "var=%var:"=""Q%" set "var=%var:;;="S"S%" set "var=%var:^;^;=;%" set "var=%var:""="%" setlocal EnableDelayedExpansion set "var=!var:"Q=!" for %%a in ("!var:"S"S=";"!") do ( if "!!"=="" endlocal if %%a neq "" echo %%~a ) 

Si desea ver una línea en blanco para cada ruta vacía resultante de consecutiva ;; delimitadores, entonces la última línea del bucle FOR puede leer simplemente echo(%%~a en echo(%%~a lugar.

O tal vez sería más obvio mostrar rutas vacías como “” usando:
if %%a=="" (echo "") else echo %%~a

Las diversas correcciones de ruta vacías también funcionan para la solución simple de jeb.

ACTUALIZAR: Aquí hay una línea simple usando JREPL.BAT

Puede utilizar mi utilidad de procesamiento de texto de expresiones regulares JREPL.BAT para lograr una solución simple y muy robusta. JREPL.BAT es una secuencia de comandos pura (JScript / lote híbrido) que se ejecuta de forma nativa en cualquier máquina con Windows desde XP en adelante.

 jrepl "([^;\q]+|\q.*?(\q|$))+" $0 /x /jmatch /s path 

Una actualización de la solución one-liner muy inteligente de Stephan Quan: el problema que encontré fue que un punto y coma posterior (y quizás dos punto y coma consecutivos, es decir, un elemento de ruta vacío) haría que apareciera el mensaje “ECHO activado”. Lo resolví insertando un período inmediatamente después de la segunda statement de ECHO (que es la syntax para suprimir los mensajes de encendido / apagado de ECHO). Sin embargo, dará como resultado una línea vacía adicional:

 ECHO %PATH:;= & ECHO.% 

Sé que esto es viejo, pero FWIW; Siempre me encuentro con querer esto por alguna razón u otra. Hace algún tiempo, me escribí un guión para hacer esto. Puse un poco de brillo y lo publiqué en mi blog.

Sientase libre de usarlo.

Se llama epath, y el archivo está en inzi.com. Se comstack como un EXE para un uso fácil (usando vbsedit): aquí

Puedes descargar el exe allí. Aquí está el código fuente del script si lo quiere como un script vbs.

  scriptname = Wscript.ScriptName 'objFSO.GetFileName(WScript.FullName) Function BubbleSort(arrData,strSort) 'borrowed from here: http://vbscripter.blogspot.com/2008/03/q-how-do-i-sort-data-in-array.html 'Input: arrData = Array of data. Text or numbers. 'Input: strSort = Sort direction (ASC or ascending or DESC for descending) 'Output: Array 'Notes: Text comparison is CASE SENSITIVE ' strSort is checked for a match to ASC or DESC or else it defaults to Asc strSort = Trim(UCase(strSort)) If Not strSort = "ASC" And Not strSort = "DESC" Then strSort = "ASC" End If For i = LBound(arrData) to UBound(arrData) For j = LBound(arrData) to UBound(arrData) If j <> UBound(arrData) Then If strSort = "ASC" Then If UCase(arrData(j)) > UCase(arrData(j + 1)) Then TempValue = arrData(j + 1) arrData(j + 1) = arrData(j) arrData(j) = TempValue End If End If If strSort = "DESC" Then If UCase(arrData(j)) < UCase(arrData(j + 1)) Then TempValue = arrData(j + 1) arrData(j + 1) = arrData(j) arrData(j) = TempValue End If End If End If Next Next BubbleSort = arrData End Function If Wscript.Arguments.Count>0 Then Set args = Wscript.Arguments bInLines = False bInAlphabetical = False bReverseSort = False bShowHelp = False For Each arg In args Select Case arg Case "-l" bInLines = True Case "-a" bInAlphabetical = True Case "-r" bReverseSort = True Case Else bShowHelp=True End Select Next If bInLines = False Then bShowHelp=True End if If bShowHelp Then sTxt = sTxt + "" & vbCrLf sTxt = sTxt + scriptname & " Displays the system path in optionally friendly formats." & vbCrLf sTxt = sTxt + "ePath is helpful when viewing the system path and easily identifying folders therein." & vbCrLf sTxt = sTxt + "" & vbCrLf sTxt = sTxt + "EPATH [-l] [-a] [-r]" & vbCrLf sTxt = sTxt + "" & vbCrLf sTxt = sTxt + "Switches:" & vbCrLf sTxt = sTxt + vbTab + "[-l]" + vbtab + "Show the path broken out in lines" & vbCrLf sTxt = sTxt + vbtab + "[-a]" + vbTab + "Sort the path broken out in lines sorted alphabetically" & vbCrLf sTxt = sTxt + vbtab + "[-r]" + vbTab + "Reverse the alphabetic sort [asc default] (ignored without -a)" & vbCrLf sTxt = sTxt + "" & vbCrLf sTxt = sTxt + vbTab + "Examples:" & vbCrLf sTxt = sTxt + vbTab + vbTab + scriptname & vbTab & "(Show %PATH% normally)" & vbCrLf sTxt = sTxt + vbTab + vbTab + scriptname & " -l" & vbCrLf sTxt = sTxt + vbTab + vbTab + scriptname & " -l -a" & vbCrLf sTxt = sTxt + vbTab + vbTab + scriptname & " -l -a -r" & vbCrLf sTxt = sTxt + vbTab + vbTab + scriptname & " -? Display help (what you are seeing now)" & vbCrLf sTxt = sTxt + "" & vbCrLf sTxt = sTxt + "More info or questions at http://inzi.com" & vbCrLf Wscript.Echo sTxt WScript.Quit Else Set wshShell = CreateObject( "WScript.Shell" ) sPath = wshShell.ExpandEnvironmentStrings( "%PATH%" ) thePath = Split(sPath,";") If bInAlphabetical Then If bReverseSort Then sDirection = "DESC" End If thePath = BubbleSort(thePath, sDirection) End if For Each item In thePath WScript.Echo item Next Set wshShell = Nothing End if Else 'Nothing, echo the path. Set wshShell = CreateObject( "WScript.Shell" ) WScript.Echo wshShell.ExpandEnvironmentStrings( "%PATH%" ) Set wshShell = Nothing End If 

La respuesta de Stephen Quan es más corta y mejor, pero aquí hay una solución de Python:

 python -c "import os; print os.environ['PATH'].replace(';', '\n');" 

Girando ; punto y coma en \n nuevas líneas.

@ROMANIA_engineer propuso una solución de PowerShell en un comentario. Como la pregunta requiere un comando que funcione en el shell de CMD, aquí hay una manera de usar ese elegante código del entorno deseado del OP:

powershell -Command ($env:Path).split(';')

Para que sea aún más legible, puede agregar clasificación:

powershell -Command ($env:Path).split(';') | sort

Crédito: https://stackoverflow.com/a/34920014/704808

Esto funciona en la ventana de cmd usando Git Bash en Windows:

echo -e ${PATH//:/\\n}

También puede crear un alias útil en su .bash_profile :

alias showpath='echo -e ${PATH//:/\\n}'