'漂亮打印'窗口%PATH%variables – 如何分割';' 在CMD shell中

我想在Windows CMD提示符下运行一个简单的单行命令来打印我的%PATH%variables,每行一个条目。

我试过这个: for /f "delims=;" %a in ("%path%") do echo %a 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上,没有"围绕一个单一的元素
testingpath= C:\ qt \ 4.6.3 \ bin; C:\ Program Files; C:\ documents&Settings

但“一直”的解决scheme有点复杂
编辑:现在一个工作变体

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

我到底在做什么?
我试图解决主要的问题,即引号内的分号应该被忽略,只有正常的分号应该被replace为";"

我使用批解释本身来解决这个问题。
首先,我必须使string安全 ,避开所有特殊字符。
那么所有';' 被replace为^;^; 然后技巧开始在行set var=%var:"=""%" (缺less的报价是关键!)。
这扩大了所有逃脱的人物都失去了他们的脱口而出的方式
var=foo & bar;;baz<>gak;;"semi^;^;colons^;^;^&embedded";;foo again!;;
但是只有引号之外,所以现在引号之外的分号之间有区别。 和里面^;^;
这是关键。

打印PATH环境variables的简单的一行:

 ECHO.%PATH:;= & ECHO.% 

如果你的PATH等于A;B;C ,上面的stringreplace将把它改成ECHO.A & ECHO.B & ECHO.C并一次执行它。 句号阻止“ECHO is on”消息出现。

我对jeb聪明的“永远”解决scheme做了小小的改进。 目前jeb的解决scheme有以下问题:

  1. 如果引导path包含在引号中,则第一个输出以“”开头
  2. 如果尾部path用引号括起来,那么最后的输出以“”结尾
  3. 如果任何path包含无害但不起作用的连续“”,则输出保留“”
  4. 如果var包含连续的;; 分隔符然后输出ECHOclosures

这个解决scheme解决了小问题,再加上less了两个replace。 我也消除了循环内不必要的重复启用/禁用延迟扩展。 (编辑于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 ) 

如果你想看到连续产生的每条空path的空行; 分界符,那么FOR循环的最后一行可以简单地读取echo(%%~a

或者,使用下面的命令将空白path显示为“”会更明显:
if %%a=="" (echo "") else echo %%~a

各种空path修复也适用于jeb简单的解决scheme。

更新:这是一个简单的使用JREPL.BAT的单行程式

您可以使用我的JREPL.BAT正则expression式文本处理实用程序来实现一个简单,非常健壮的解决scheme。 JREPL.BAT是纯粹的脚本(混合JScript /批处理),可以从XP以后的任何Windows机器上本机运行。

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

对Stephan Quan非常聪明的单行解决scheme的更新:我遇到的问题是后面的分号(也许是两个连续的分号,即空path元素)会导致出现“ECHO is on”消息。 我通过在第二个ECHO语句之后插入一个句点(这是抑制ECHO的语法是开/关消息)来解决这个问题。 但是,这将导致一个额外的空行:

 ECHO %PATH:;= & ECHO.% 

我知道这是旧的,但FWIW; 我总是因为某种原因而想要这个。 前一段时间,我写了一个脚本来做这个。 我在上面放了一点点擦亮剂,并把它贴在我的博客上。

随意使用它。

它叫做epath,文件位于inzi.com。 它被编译为一个易于使用的EXE(使用vbsedit): 在这里

你可以在那里下载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 

Stephen Quan的答案更短,更好,但是这是一个Python解决scheme:

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

车削; 分号转换成\n换行符。

@ROMANIA_engineer在评论中提出了一个PowerShell解决scheme。 由于该问题要求在CMD shell中有效的命令,因此可以使用OP期望的环境中的优雅代码:

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

为了使其更具可读性,您可以添加sorting:

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

信用: https : //stackoverflow.com/a/34920014/704808