web-dev-qa-db-ja.com

'きれいな印刷'ウィンドウの%PATH%変数-';'で分割する方法CMDシェル

Windows CMDプロンプトで単純な1行を実行して、_%PATH%_変数を1行に1エントリずつ出力します。

私はこれを試しました:for /f "delims=;" %a in ("%path%") do echo %aしかし、これは最初のエントリのみを出力します:

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

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

また、上記の出力からわかるように、これは_echo %a_コマンドと出力も出力しています。これを止める方法はありますか?

同様のコマンドを実行すると、すべてのエントリが表示されますが、結果をスパミングする_echo %a_出力が表示されます。以下がすべてのエントリを出力する理由がわかりませんが、_%PATH%_での試行では出力されません。 _/F_スイッチが理解できないと思います。

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

Z:\>echo 1
1

Z:\>echo 2
2

Z:\>echo 3
3
_
49
sam

簡単な方法は使用することです

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

これは、パスに;がなく、単一の要素の周りに"がない場合に機能します。
path = C:\ qt\4.6.3\bin; C:\ Program Files; C:\ documents&Settingsでテスト

しかし、「常に」ソリューションは少し複雑です
編集:機能するバリアント

@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
)

そこで何をしましたか?
主な問題を解決しようとしました:引用符内のセミコロンは無視する必要があり、normalセミコロンのみを置き換える必要があります";"

私はこれを解決するためにバッチインタープリター自体を使用しました。

  • まず、文字列safeにして、すべての特殊文字をエスケープする必要があります。
  • 次に、すべての;^;^;に置き換えられます
  • そしてトリックはラインから始まります
    set var=%var:"=""%"(欠落している引用が鍵です!).
    これは、エスケープされたすべての文字がエスケープキャレットを失うような方法で拡張されます。
    var=foo & bar;;baz<>gak;;"semi^;^;colons^;^;^&embedded";;foo again!;;...
    ただし、引用符の外側のみなので、引用符の外側のセミコロンと;;の内側と^;^;の内側には違いがあります。
    それが鍵です。
68
jeb

PATH環境変数をきれいに出力するための簡単な1行:

ECHO.%PATH:;= & ECHO.%

PATHA;B;Cと等しい場合、上記の文字列置換はこれをECHO.A & ECHO.B & ECHO.Cに変更し、すべてを一度に実行します。完全に停止すると、「ECHO is on」メッセージが表示されなくなります。

66
Stephen Quan

Stephan Quanの非常に巧妙なワンライナーソリューションの更新:私が遭遇した問題は、末尾のセミコロン(およびおそらく2つの連続するセミコロン、つまり空のパス要素)が原因で「ECHO is on」というメッセージが表示されることでした。 2番目のECHOステートメントの直後にピリオドを挿入することで、これを解決しました(これは、ECHO is on/offメッセージを抑制する構文です)。ただし、余分な空行が発生します。

ECHO %PATH:;= & ECHO.%
10
user1998693

Jebの「常に」ソリューションのマイナーな改善があります。現在、Jebのソリューションには次の問題があります。

  1. 先頭のパスが引用符で囲まれている場合、最初の出力は ""で始まります
  2. 後続パスが引用符で囲まれている場合、最後の出力は ""で終わります
  3. パスに無害ではあるが機能しない連続する「」が含まれている場合、出力には「」が保持されます
  4. Varに連続が含まれている場合、;区切り文字が出力されますECHOはオフです

このソリューションは、マイナーな問題を修正し、さらに2つ少ない置換を使用します。また、ループ内での遅延拡張の不要な繰り返しの有効化/無効化を排除しました。 (2011-10-30の編集により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
)
_

連続した;;の結果、空のパスごとに空白行を表示したい場合。区切り文字の場合、FORループの最後の行は、代わりに単に_echo(%%~a_を読み取ることができます。

または、次を使用して空のパスを ""として表示する方がわかりやすいかもしれません。
if %%a=="" (echo "") else echo %%~a

空のさまざまなパス修正は、jebの単純なソリューションでも機能します。


更新:JREPL.BATを使用した簡単な1行

My JREPL.BAT正規表現テキスト処理ユーティリティ を使用して、シンプルで非常に堅牢なソリューションを実現できます。 JREPL.BATは、すべてのWindowsマシンでXP以降)でネイティブに実行される純粋なスクリプト(ハイブリッドJScript /バッチ)です。

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

Stephen Quanの答え は短くて良いですが、ここにPythonソリューションがあります:

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

;セミコロンを\n改行に変換します。

2
Bob Stein

これは古いのですが、FWIW。私はいつも何らかの理由でこれを欲しがっています。少し前に、これを行うためのスクリプトを自分で作成しました。少し磨いてブログに投稿しました。

お気軽にご利用ください。

これはepathと呼ばれ、ファイルはinzi.comにあります。簡単に使用できるようにEXEとしてコンパイルされています(vbseditを使用): here

あなたはそこにexeをダウンロードすることができます。これが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

@ROMANIA_engineerは、PowerShellソリューションをコメントで提案しました。質問はCMDシェルで機能するコマンドを要求するため、OPの望ましい環境からそのエレガントなコードを使用する方法を次に示します。

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

さらに読みやすくするために、並べ替えを追加できます。

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

クレジット: https://stackoverflow.com/a/34920014/704808

1
weir

このスクリプトは、JREPL.batを使用して現在のWindowsパスをtxtファイルに解析します。これは、dbenhamによる上記の投稿に触発されました。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

:::: THIS SCRIPT WILL PARSE THE CURRENT WINDOWS PATH INTO AT TXT FILE ::::
:::: EACH FOLDER FOUND IN PATH WILL BE ON A SEPARATE LINE ::::

:::: SCRIPT INSTRUCTIONS ::::
:: PLACE JREPL.bat IN C:\WINDOWS\SYSTEM32 FOLDER OR CUSTOM LOCATION OF YOUR CHOOSING ::
:: IF PLACED IN CUSTOM FOLDER YOU MUST LINK IT TO WINDOWS PATH ::
:: YOU CAN ACCESS WINDOWS PATH BY RUNNING THE BELOW COMMAND IN CMD.EXE ::
:: Rundll32 sysdm.cpl,EditEnvironmentVariables ::
:: DOWNLOAD JREPL.bat https://www.dostips.com/forum/viewtopic.php?t=6044 ::

:: SET WORKING DIRECTORY ::
CD /D "C:\WINDOWS\SYSTEM32"

:: UNCOMMENT LINE BELOW AND SET YOUR JREPL.bat SAVED FOLDER PATH IF YOU HAVE A BACKUP COPY ::
:: SET JOUT=<FOLDER PATH>

:: SET OUTPUT FILE ::
    SET FOUT=%USERPROFILE%\DESKTOP\PARSE.TXT

:: SET FILE TO SEARCH FOR ::
:: THIS SEARCHES FOR JREPL.BAT IN THE CURRENT WORKING DIR ::
    SET I=JREPL.BAT

:: SET CONTROL FILE TO CHECK AGAINST ::
:: THIS IS FOR DEBUGGING PURPOSES AND SHOULD NOT BE CHANGED OTHERWISE ::
    SET J=JREPL.BAT

:::: START SCRIPT ::::
    SET RESULT=
    FOR /F "DELIMS=" %%A IN ('DIR /B /O:N ^| FINDSTR /S /I "%I%" %TMP_RESULT_FILE%') DO (
    SET RESULT=%%A
    )

IF /I !RESULT! EQU %J% (
ECHO !RESULT! ^^!^^!EXISTS^^!^^!
    TIMEOUT 3 >NUL
    CALL :FOUND
    GOTO END
) ELSE (
    GOTO NOTFOUND
)
    GOTO ERROR

:FOUND
    FOR %%G IN (%I%) DO (
    %%G "([^;\Q]+|\Q.*?(\Q|$))+" $0 /X /JMATCH /S PATH>>%FOUT%
    CLS && ECHO.
ECHO %I% ^^!^^!EXECUTED SUCCESSFULLY^^!^^!
    TIMEOUT /T 3 >NUL
    Explorer "%FOUT%"
    GOTO END
( ELSE )
    GOTO ERROR
)

:NOTFOUND
    ECHO %I% ^^!^^!NOT FOUND^^!^^!
    TIMEOUT 3 >NUL
    CLS && ECHO.
:: UNCOMMENT THE LINES BELOW TO OPEN JREPL.BAT SAVE FOLDER IF AVAILABLE ::
    :: ECHO ^^!^^!OPENING^^!^^! %I%'S SAVED FOLDER
  :: TIMEOUT 3 >NUL
    :: Explorer "%JOUT%"
  GOTO END
    ( ELSE )
    GOTO ERROR
    )

:ERROR
    CLS && ECHO.
    ECHO ^^!^^!ERROR RUNNING^^!^^! %I%
    TIMEOUT 3 >NUL
    CLS && ECHO.
    ECHO ^^!^^!PLEASE FIX SCRIPT^^!^^! ::::::::::::::::::
    TIMEOUT 3 >NUL

:END
    ENDLOCAL && EXIT /B
0
slyfox1186

これは、WindowsのGit Bashを使用してcmdウィンドウで機能します。

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

.bash_profileに便利なエイリアスを作成することもできます:

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

0
SherylHohman