web-dev-qa-db-fra.com

'Jolie impression' windows% PATH% variable - comment diviser sur ';' en shell CMD

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
42
sam

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. 

  • Je dois d'abord créer la chaîne safe, en évitant tous les caractères spéciaux. 
  • Alors tous les ; sont remplacés par ^;^; 
  • et puis le tour commence par la ligne
    set var=%var:"=""%" (la citation manquante est la clé!).
    Cela se développe de manière à ce que tous les caractères échappés perdent leur caractère d'échappement:
    var=foo & bar;;baz<>gak;;"semi^;^;colons^;^;^&embedded";;foo again!;;...
    Mais seulement en dehors des guillemets, il existe donc une différence entre les points-virgules en dehors des guillemets ;; et à l'intérieur ^;^;.
    .__ C'est la clé.
64
jeb

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é".

62
Stephen Quan

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.%
10
user1998693

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
1
Marble68

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.

1
Bob Stein

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}'

0
SherylHohman