Je souhaite exécuter une simple ligne dans l'invite CMD de Windows pour imprimer ma variable %PATH%
, une entrée par ligne.
J'ai essayé ceci: for /f "delims=;" %a in ("%path%") do echo %a
mais ceci n'imprime que la première entrée:
Z:\>for /f "delims=;" %a in ("%path%") do echo %a
Z:\>echo c:\python25\.
c:\python25\.
De plus, comme vous pouvez le constater dans la sortie ci-dessus, il s’agit également d’imprimer la commande echo %a
ainsi que la sortie. Y a-t-il un moyen d'arrêter cela?
Si j'essaie une commande similaire, j'obtiens toutes les entrées, mais j'obtiens quand même la sortie echo %a
qui diffuse les résultats. Je ne comprends pas pourquoi ce qui suit imprime toutes les entrées, mais ma tentative sur %PATH%
ne fonctionne pas. Je suppose que je ne comprends pas le commutateur /F
.
Z:\>for %a in (1 2 3) do echo %a
Z:\>echo 1
1
Z:\>echo 2
2
Z:\>echo 3
3
Le moyen le plus simple est d'utiliser
for %a in ("%path:;=";"%") do @echo %~a
Cela fonctionne pour tous sans ;
dans le chemin et sans "
autour d'un seul élément
Testé avec path = C:\qt\4.6.3\bin; C:\Fichiers de programme; C:\documents et paramètres
Mais une solution "toujours" est un peu compliquée
EDIT: Maintenant une variante de travail
@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'est-ce que j'ai fait là-bas?
J'ai essayé de résoudre le problème principal: ignorer les points-virgules à l'intérieur de guillemets et ne remplacer que les points-virgules normal par ";"
J'ai utilisé l'interprète batch lui-même pour résoudre ce problème.
;
sont remplacés par ^;^;
set var=%var:"=""%"
(la citation manquante est la clé!).var=foo & bar;;baz<>gak;;"semi^;^;colons^;^;^&embedded";;foo again!;;
...;;
et à l'intérieur ^;^;
.Un simple support pour imprimer la variable d’environnement PATH
:
ECHO.%PATH:;= & ECHO.%
Si votre PATH
était égal à A;B;C
, la substitution de chaîne ci-dessus changera ceci en ECHO.A & ECHO.B & ECHO.C
et l'exécutera en une fois. L’arrêt complet empêche l’apparition des messages "ECHO est activé".
Mise à jour de la solution très intelligente à une ligne de Stephan Quan: le problème que j'ai rencontré était qu'un point-virgule final (et peut-être deux points-virgules successifs, à savoir un élément de chemin vide) ferait apparaître le message "ECHO est activé". J'ai résolu ce problème en insérant un point immédiatement après la deuxième instruction ECHO (la syntaxe permettant de supprimer les messages d'activation/désactivation d'ECHO). Cependant, il en résultera une ligne vide supplémentaire:
ECHO %PATH:;= & ECHO.%
Je sais que c'est vieux, mais FWIW; J'ai toujours envie de cela pour une raison ou une autre. Il y a quelque temps, j'ai écrit moi-même un script pour le faire. J'ai mis un peu de vernis dessus et l'ai posté sur mon blog.
Sentez-vous libre de l'utiliser.
Cela s'appelle epath, et le fichier se trouve sur inzi.com. Il est compilé en tant que fichier EXE pour une utilisation facile (avec vbsedit): ici
Vous pouvez télécharger l'exe ici. Voici le code source du script si vous le souhaitez en tant que 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 réponse de Stephen Quan est plus courte et meilleure, mais voici une solution Python:
python -c "import os; print os.environ['PATH'].replace(';', '\n');"
Conversion des points-virgules ;
en __ nouvelles lignes \n
.
Cela fonctionne dans la fenêtre cmd avec Git Bash sous Windows:
echo -e ${PATH//:/\\n}
Vous pouvez également créer un alias pratique dans votre .bash_profile
:
alias showpath='echo -e ${PATH//:/\\n}'