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
_
簡単な方法は使用することです
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セミコロンのみを置き換える必要があります";"
私はこれを解決するためにバッチインタープリター自体を使用しました。
;
が^;^;
に置き換えられますset var=%var:"=""%"
(欠落している引用が鍵です!).var=foo & bar;;baz<>gak;;"semi^;^;colons^;^;^&embedded";;foo again!;;
...;;
の内側と^;^;
の内側には違いがあります。PATH
環境変数をきれいに出力するための簡単な1行:
ECHO.%PATH:;= & ECHO.%
PATH
がA;B;C
と等しい場合、上記の文字列置換はこれをECHO.A & ECHO.B & ECHO.C
に変更し、すべてを一度に実行します。完全に停止すると、「ECHO is on」メッセージが表示されなくなります。
Stephan Quanの非常に巧妙なワンライナーソリューションの更新:私が遭遇した問題は、末尾のセミコロン(およびおそらく2つの連続するセミコロン、つまり空のパス要素)が原因で「ECHO is on」というメッセージが表示されることでした。 2番目のECHOステートメントの直後にピリオドを挿入することで、これを解決しました(これは、ECHO is on/offメッセージを抑制する構文です)。ただし、余分な空行が発生します。
ECHO %PATH:;= & ECHO.%
Jebの「常に」ソリューションのマイナーな改善があります。現在、Jebのソリューションには次の問題があります。
このソリューションは、マイナーな問題を修正し、さらに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の単純なソリューションでも機能します。
My JREPL.BAT正規表現テキスト処理ユーティリティ を使用して、シンプルで非常に堅牢なソリューションを実現できます。 JREPL.BATは、すべてのWindowsマシンでXP以降)でネイティブに実行される純粋なスクリプト(ハイブリッドJScript /バッチ)です。
_jrepl "([^;\q]+|\q.*?(\q|$))+" $0 /x /jmatch /s path
_
Stephen Quanの答え は短くて良いですが、ここにPythonソリューションがあります:
python -c "import os; print os.environ['PATH'].replace(';', '\n');"
;
セミコロンを\n
改行に変換します。
これは古いのですが、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
@ROMANIA_engineerは、PowerShellソリューションをコメントで提案しました。質問はCMDシェルで機能するコマンドを要求するため、OPの望ましい環境からそのエレガントなコードを使用する方法を次に示します。
powershell -Command ($env:Path).split(';')
さらに読みやすくするために、並べ替えを追加できます。
powershell -Command ($env:Path).split(';') | sort
このスクリプトは、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
これは、WindowsのGit Bashを使用してcmdウィンドウで機能します。
echo -e ${PATH//:/\\n}
.bash_profile
に便利なエイリアスを作成することもできます:
alias showpath='echo -e ${PATH//:/\\n}'