Переменная '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.%
У меня есть небольшие улучшения в умном "всегда" решении Джеба. В настоящее время решение Джеба имеет следующие проблемы:
- Если начальный путь заключен в кавычки, то первый вывод начинается с ""
- Если конечный путь заключен в кавычки, то последний вывод заканчивается на ""
- Если какой-либо путь содержит безвредные, но нефункциональные последовательные символы "", то выходные данные сохраняют ""
- Если 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 ` `
- Для использования с двойными кавычками:
>
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`
- С подстановкой:
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