Переменная 'Pretty print' windows %PATH% - как разделить на ';' в оболочке CMD

Я хочу запустить простую однострочную строку в приглашении Windows CMD, чтобы напечатать мой %PATH% переменная, одна запись в строке.

Я попробовал это: 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

13 ответов

Решение

Простой способ заключается в использовании

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

Это работает для всех без ; в пути и без " вокруг одного элемента
Протестировано с путем =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
)

Что я там делал?
Я попытался решить главную проблему: точки с запятой внутри кавычек должны игнорироваться, и только нормальные точки с запятой следует заменить на ";"

Я использовал сам пакетный интерпретатор, чтобы решить это для меня.

  • Сначала я должен сделать строку безопасной, избегая всех специальных символов.
  • Тогда все ; заменены на ^;^;
  • а затем трюк начинается с линии
    set var=%var:"=""%" (Пропавшая цитата является ключом!).
    Это расширяется таким образом, что все сбежавшие персонажи потеряют свою escape-карету:
    var=foo & bar;;baz<>gak;;"semi^;^;colons^;^;^&embedded";;foo again!;;...
    Но только за пределами кавычек, так что теперь есть разница между точками с запятой за пределами кавычек ;; и внутри ^;^;,
    Вот ключ.

Простой вкладыш в красивую печать PATH переменная окружения:

ECHO.%PATH:;= & ECHO.%

Если твой PATH был равен A;B;C приведенная выше замена строки изменит это на ECHO.A & ECHO.B & ECHO.C и выполнить все это за один раз. Полная остановка предотвращает появление сообщений "ECHO on".

Обновление очень умного однострочного решения Стефана Куана: проблема, с которой я столкнулся, заключалась в том, что конечная точка с запятой (и, возможно, две последовательные точки с запятой, т.е. пустой элемент пути) приводила к появлению сообщения "ECHO on". Я решил эту проблему, вставив точку сразу после второго оператора ECHO (который является синтаксисом для подавления сообщений ECHO on/off). Тем не менее, это приведет к дополнительной пустой строке:

ECHO %PATH:;= & ECHO.%

У меня есть небольшие улучшения в умном "всегда" решении Джеба. В настоящее время решение Джеба имеет следующие проблемы:

  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

Вы можете использовать мою утилиту обработки текста с помощью регулярных выражений JREPL.BAT, чтобы получить простое и очень надежное решение. JREPL.BAT - это чистый скрипт (гибридный JScript/batch), который работает на любом компьютере под управлением Windows начиная с XP.

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

Ответ Стивена Куана короче и лучше, но вот решение Python:

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

Превращение ; точки с запятой в \n переводы строк.

Это работает в окне cmd, используя Git Bash в Windows:

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

Вы также можете сделать удобный псевдоним в своем .bash_profile:

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

@ROMANIA_engineer предложил решение PowerShell в комментарии. Поскольку вопрос касается команды, которая работает в оболочке CMD, вот способ использовать этот элегантный код из желаемой среды OP:

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

Чтобы сделать его еще более читабельным, вы можете добавить сортировку:

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

Кредит: /questions/4192554/echo-path-na-otdelnyih-strokah/4192570#4192570

Вот хорошо прокомментированный сценарий, который анализирует список элементов, разделенных точкой с запятой, с учетом необязательного цитирования каждого элемента и позволяет даже элементы с точкой с запятой в них (если они цитируются). Поскольку он использует goto loop это может быть не самый быстрый подход, но он должен быть безопасным для специальных символов:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define semicolon-separated list here (sample taken from https://stackru.com/a/5472168):
set "BUFFER=foo & bar;baz<>gak;"semi;colons;^&embedded";foo again!;throw (in) some (parentheses);"unmatched ;-)";(too"

setlocal EnableDelayedExpansion
echo BUFFER: !BUFFER!
echo/
endlocal

rem // Initialise items counter and clear (pseudo-)array variable:
set /A "IDX=0" & for /F "delims==" %%V in ('set $ITEM[ 2^> nul') do set "%%V="
rem // Utilise a `goto` loop to retrieve all items:
:PARSE_LOOP
rem // Check for availability of further items:
if defined BUFFER (
    rem // Increment items counter:
    set /A "IDX+=1"
    rem // Toggle delayed expansion to avoid troubles with `!`:
    setlocal EnableDelayedExpansion
    rem // Put current items counter into a `for` meta-variable:
    for %%I in (!IDX!) do (
        rem // Check whether current item begins with `"`, hence it is quoted:
        if "!BUFFER:~,1!" == ""^" (
            rem /* This point is reached when current item is quoted, hence
            rem    remove the opening `"` and split off everything past the
            rem    next one (that is the closing `"`) from the items buffer: */
            for /F tokens^=1*^ delims^=^"^ eol^=^" %%A in (";!BUFFER:~1!") do (
                endlocal
                rem // Store current item into array in unquoted manner:
                set "$ITEM[%%I]=%%A" & setlocal EnableDelayedExpansion
                for /F "delims=" %%C in ("$ITEM[%%I]=!$ITEM[%%I]:~1!") do (
                    endlocal & set "%%C" & if not defined $ITEM[%%I] set /A "IDX-=1"
                )
                rem /* Transfer remaining items beyond `endlocal` barrier;
                rem    note that a delimiters-only line still causes `for /F`
                rem    to iterate when there is just `tokens=*`: */
                for /F "tokens=* delims=;" %%D in (";%%B") do set "BUFFER=%%D"
                setlocal EnableDelayedExpansion
            )
        ) else (
            rem /* This point is reached when current item is not quoted,
            rem    hence split items string at next semicolon `;`: */
            for /F "tokens=1* delims=;" %%A in ("!BUFFER!") do (
                endlocal
                rem // Store current (unquoted) item into array:
                set "$ITEM[%%I]=%%A"
                rem // Transfer remaining items beyond `endlocal` barrier:
                set "BUFFER=%%B"
                setlocal EnableDelayedExpansion
            )
        )
    )
    endlocal
    rem // Loop back to retrieve next item:
    goto :PARSE_LOOP
)
rem // Return all retrieved items:
setlocal EnableDelayedExpansion
for /L %%I in (1,1,%IDX%) do echo ITEM %%I: !$ITEM[%%I]!
endlocal

echo/
echo INFO:   %IDX% items
echo ERROR:  %ErrorLevel%

endlocal
exit /B

Оригинальная версия

Это подход, который выполняет только несколько замен символов, которые могут правильно обрабатывать список, разделенный точками с запятой, необязательно цитируемых элементов, которые в кавычках могут даже содержать точки с запятой сами по себе. Пустые элементы списка также обрабатываются правильно. Ключ к успеху - научиться различать точки с запятой в кавычках (которые являются частью элемента списка) и те, которые не используются (которые составляют разделители):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define semicolon-separated list here (sample taken from https://stackru.com/a/5472168):
set "BUFFER=foo & bar;baz<>gak;"semi;colons;^&embedded";foo again!;throw (in) some (parentheses);"unmatched ;-)";(too"
rem set "BUFFER="caret ^^";"bang !";"caret ^^ bang !""

set BUFFER & echo/

setlocal EnableDelayedExpansion
rem // Replace `^` by `^@` to avoid sequences of `^`:
set "BUFFER=!BUFFER:^=^@!"

rem // Escape special characters `^`, `&`, `<`, `>`, `|`:
set "BUFFER=!BUFFER:^=^^!"
set "BUFFER=!BUFFER:&=^&!"
set "BUFFER=!BUFFER:<=^<!"
set "BUFFER=!BUFFER:>=^>!"
set "BUFFER=!BUFFER:|=^|!"

rem // Escape `;`:
set "BUFFER=!BUFFER:;=^;!"

rem // Expand immediately, so escaping is processed for unquoted portions:
endlocal & set ^"BUFFER=%BUFFER%^"
setlocal EnableDelayedExpansion

rem // Escape `^`, `&`, `<`, `>`, `|`, hence quoted portions become double-escaped:
set "BUFFER=!BUFFER:^=^^!"
set "BUFFER=!BUFFER:&=^&!"
set "BUFFER=!BUFFER:<=^<!"
set "BUFFER=!BUFFER:>=^>!"
set "BUFFER=!BUFFER:|=^|!"

rem /* Replace `^^^` by `^` in order to resolve double-escaping;
rem    at this point, quoted `;` are represented by the sequence `^^;`: */
set "BUFFER=!BUFFER:^^^=^!"

rem // Escape `"`, so everything appears unquoted then:
set "BUFFER=!BUFFER:"=^^"!"

rem /* Expand immediately, so escaping is again processed;
rem    at this point, originally quoted `;` are represented by `^;`: */
set "BUFFER=!BUFFER:^=^^^!"
set ^"BUFFER=%BUFFER:!=^^!%^" !

rem // Remove all `"` from string:
set "BUFFER=!BUFFER:"=!^"

rem // Enclose whole string in `""` and replace each `;` by `";"`:
set ^"BUFFER="!BUFFER:;=";"!"^"

rem // Replace `^";"` (which are originally quoted `;`) by `;`:
set "BUFFER=!BUFFER:^";"=;!"

rem // Finally revert initial replacement of `^` by `^@`:
set "BUFFER=!BUFFER:^@=^!"

set BUFFER & echo/

rem // Eventually return the list items:
for %%I in (!BUFFER!) do (
    if "!!"=="" endlocal & rem // (technique taken from https://stackru.com/a/7940444)
    echo(%%~I
)

endlocal
exit /B

Улучшенная версия

Вот улучшенный подход, который выполняет меньше замен:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define semicolon-separated list here:
set "BUFFER="caret ^^";"bang !";"caret ^^; ^& bang !";caret ^;bang !;caret ^@ & bang !"

set BUFFER & echo/

setlocal EnableDelayedExpansion
rem // Replace `^` by `^@` to avoid sequences of `^`:
set "BUFFER=!BUFFER:^=^@!"

rem // Double-escape special characters `^`, `&`, `<`, `>`, `|`:
set "BUFFER=!BUFFER:^=^^^^!"
set "BUFFER=!BUFFER:&=^^^&!"
set "BUFFER=!BUFFER:<=^^^<!"
set "BUFFER=!BUFFER:>=^^^>!"
set "BUFFER=!BUFFER:|=^^^|!"

rem // Replace `;` by `^^;`:
set "BUFFER=!BUFFER:;=^^;!"

rem // Expand immediately, so escaping is processed for unquoted portions:
endlocal & set ^"BUFFER=%BUFFER%^"
setlocal EnableDelayedExpansion

rem /* Replace `^^^` by `^` in order to resolve double-escaping; at this point,
rem    quoted `;` are represented by the sequence `^^;`, unquoted ones by `^;`: */
set "BUFFER=!BUFFER:^^^=^!"

rem // Escape `"`, so everything appears unquoted then:
set "BUFFER=!BUFFER:"=^^"!"

rem /* Expand immediately, so escaping is again processed;
rem    at this point, originally quoted `;` are represented by `^;`: */
set "BUFFER=!BUFFER:^=^^^!"
set ^"BUFFER=%BUFFER:!=^^!%^" !

rem // Remove all `"` from string:
set "BUFFER=!BUFFER:"=!^"

rem // Enclose whole string in `""` and replace each `;` by `";"`:
set ^"BUFFER="!BUFFER:;=";"!"^"

rem // Replace `^";"` (which are originally quoted `;`) by `;`:
set "BUFFER=!BUFFER:^";"=;!"

rem // Finally revert initial replacement of `^` by `^@`:
set "BUFFER=!BUFFER:^@=^!"

set BUFFER & echo/

rem // Eventually return the list items:
for %%I in (!BUFFER!) do (if "!!"=="" endlocal) & echo(%%~I

endlocal
exit /B

Еще одна реализация, достаточно компактная и функциональная.

https://github.com/andry81/contools/tree/master/Scripts/Tools/std/echo_path_var.bat

echo_path_var.bat:

      @echo off

rem USAGE:
rem   echo_path_var.bat <VAR> [<PREFIX> [<SUFFIX>]]

rem <VAR>: VALUE1;VALUE2;...;VALUEN

setlocal DISABLEDELAYEDEXPANSION

set "__?VAR__=%~1"
if not defined __?PREFIX__ set "__?PREFIX__=%~2"
if not defined __?SUFFIX__ set "__?SUFFIX__=%~3"

if not defined __?VAR__ exit /b 255
if not defined %__?VAR__% exit /b 1

rem Escape specific separator characters by sequence of `$NN` characters:
rem  1. `?` and `*` - globbing characters in the `for %%i in (...)` expression
rem  2. `,`, ` `    - separator characters in the `for %%i in (...)` expression
setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!%__?VAR__%:$=$00!") do ( endlocal & set "%__?VAR__%=%%i" )
setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!%__?VAR__%:^*=$01!") do ( endlocal & set "%__?VAR__%=%%i" )
setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!%__?VAR__%:^?=$02!") do ( endlocal & set "%__?VAR__%=%%i" )
setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!%__?VAR__%: =$03!") do ( endlocal & set "%__?VAR__%=%%i" )
rem escape tabulation character
setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!%__?VAR__%:  =$04!") do ( endlocal & set "%__?VAR__%=%%i" )
setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!%__?VAR__%:,=$05!") do ( endlocal & set "%__?VAR__%=%%i" )

setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!%__?VAR__%!") do (
  endlocal
  for %%j in (%%i) do (
    set "__?LINE__=%%j"
    rem unescape
    setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!__?LINE__:$01=^*!") do ( endlocal & set "__?LINE__=%%i" )
    setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!__?LINE__:$02=^?!") do ( endlocal & set "__?LINE__=%%i" )
    setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!__?LINE__:$03= !") do ( endlocal & set "__?LINE__=%%i" )
    setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!__?LINE__:$04=   !") do ( endlocal & set "__?LINE__=%%i" )
    setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!__?LINE__:$05=,!") do ( endlocal & set "__?LINE__=%%i" )
    setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!__?LINE__:$00=$!") do ( endlocal & set "__?LINE__=%%i" )
    rem trim leading white spaces
    rem setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims= " %%i in ("!__?LINE__!") do ( endlocal & set "__?LINE__=%%i" )
    setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!__?PREFIX__!!__?LINE__!!__?SUFFIX__!") do ( endlocal & echo.%%i)
  )
)

exit /b 0

echo_var.bat:

      @echo off

rem USAGE:
rem   echo_var.bat <VAR> [<PREFIX> [<SUFFIX>]]

setlocal DISABLEDELAYEDEXPANSION

set "__?VAR__=%~1"
if not defined __?PREFIX__ set "__?PREFIX__=%~2"
if not defined __?SUFFIX__ set "__?SUFFIX__=%~3"

if not defined __?VAR__ exit /b 255
if not defined %__?VAR__% exit /b 1

rem safe echo
setlocal ENABLEDELAYEDEXPANSION & for /F "eol= tokens=* delims=" %%i in ("!__?PREFIX__!!%__?VAR__%!!__?SUFFIX__!") do ( endlocal & echo.%%i)
exit /b 0

Предупреждение:

The eol= на самом деле не пусто и содержит04кодовый символ.

Примеры:

1.

      >
echo_path_var.bat PATH ` `
  1. Для использования с двойными кавычками:
      >
set __?PREFIX__=^"
set __?SUFFIX__=^"
echo_path_var.bat PATH
      setlocal DISABLEDELAYEDEXPANSION

set AAA=123
rem with tabulation character
set BBB="?a/b/%%c%%!" ^;     "!d! ^; e ; f" ; ; ; !AAA! ^^; g,g ;;; h h

call "%%~dp0echo_var.bat" BBB ` `
call "%%~dp0echo_path_var.bat" BBB ` `
      `"?a/b/%c%!" ;   "!d! ^; e ; f" ; ; ; !AAA! ^; g,g ;;; h h`
`"?a/b/%c%!" `
`        "!d! ^; e ; f" `
` `
` `
` !AAA! ^`
` g,g `
` h h`
  1. С подстановкой:
      set "A=c:\windows\*.exe"
call "%%~dp0echo_var.bat A"
call "%%~dp0echo_path_var.bat A"
      c:\windows\*.exe
c:\windows\bfsvc.exe
c:\windows\explorer.exe
c:\windows\fveupdate.exe
c:\windows\GSetup.exe
c:\windows\HelpPane.exe
c:\windows\hh.exe
c:\windows\notepad.exe
c:\windows\pfm.exe
c:\windows\ptsysexec.exe
c:\windows\pttestcmd.exe
c:\windows\py.exe
c:\windows\pyw.exe
c:\windows\regedit.exe
c:\windows\splwow64.exe
c:\windows\twunk_16.exe
c:\windows\twunk_32.exe
c:\windows\winhlp32.exe
c:\windows\write.exe
      set "A=c:\windows\??.exe"
call "%%~dp0echo_var.bat A"
call "%%~dp0echo_path_var.bat A"
      c:\windows\??.exe
c:\windows\hh.exe
c:\windows\py.exe

Плюсы:

  • Использоватьfor %%i in (...)оператор для анализа значения списка путей для анализаVALUE;VALUEТакже как"VALUE";"VALUE".
  • Печатает пробелы и символы табуляции как есть.
  • Игнорирует последовательность;(бывший:;;;) и рассматривает его как один символ.
  • По умолчанию может использоваться с подстановкой (в Windows путь не должен содержать символы и).

Минусы:

  • Потому что!VAR:*=...!выражение не работает должным образом, и , являются подстановочными символами, а затем строка с*и?символы должны быть в предварительно отформатированной форме:1 * 2 ? 3->1 ^* 2 ^? 3
  • Необходимо отдельно обрезать начальные и конечные пробельные символы.

Я знаю, что это старый, но 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

Возвращаясь к этому, в случае, если у вас есть node.jsи вдохновленный ответом Боба Штейна на python один лайнер.

      node -e "console.log(process.env.path.replace(/;/g,'\n'))"

Или более длинный путь:

      node -e "console.log(process.env.path.split(';').join('\n'))"

Мне нужно было найти строки, где git устанавливается так:

      node -e "console.log(process.env.path.split(';').filter(str=>str.match(/git/i)).join('\n'))"

Этот сценарий проанализирует текущий путь Windows в txt-файле с помощью JREPL.bat. Это было вдохновлено вышеупомянутым постом 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
Другие вопросы по тегам