windows - print - variables de entorno linux
''Pretty print'' variable windows% PATH%-cómo dividir en '';'' en CMD shell (8)
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 intento 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 intento 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
@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://.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}''
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 programa; 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.
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 compila como un EXE para un uso fácil (usando vbsedit): here
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
Tengo pequeñas mejoras en la inteligente solución "siempre" de jeb. Actualmente la solución de jeb tiene los siguientes problemas:
- Si la ruta principal está entre comillas, la primera salida comienza con ""
- Si la ruta final está entre comillas, la última salida finaliza con ""
- Si alguna ruta contiene "" inofensivo pero no funcional "", entonces la salida conserva el ""
- 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
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".
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 declaración de ECHO (que es la sintaxis para suprimir los mensajes de encendido / apagado de ECHO). Sin embargo, dará como resultado una línea vacía adicional:
ECHO %PATH:;= & ECHO.%
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.