Как я могу извлечь полный путь из переменной окружения PATH?

Я хочу извлечь полный путь из переменной среды PATH с помощью собственных инструментов cmd. Рассмотрим следующее PATH содержание:

C: \ Program Files \ Windows Resource Kits \ Tools \; C: \ Perl \ site \ bin; C: \ Perl \ bin; C: \ WI NDOWS \ system32; C: \ WINDOWS; C: \ WINDOWS \ System32 \ Wbem ; c: \ Program Files \ Microsoft SQ L Server \ 90 \ Tools \ binn \; C: \ WINDOWS \ system32 \ WindowsPowerShell \ v1.0; C: \ Program Fi les \ Microsoft SQL Server \ 80 \ Tools \ Binn \; C: \ Program Files \ Microsoft SQL Server \ 10 0 \ DTS \ Binn \; C: \ Program Files \ Microsoft SQL Server \ 100 \ Tools \ Binn \; c: \ program fil es \ nmap \; C: \ Program Files \ WinRAR \; C: \ Program Files \ QuickTime \ QTSystem \; C: \ Progra m Files \ hydra-5.4-win \; C: \ Program Files \ john1701 \ run; C: \ dig ;; C: \ cygwin; C: \ wamp \ b в \ mysql \ mysql5.0.45 \ bin; C: \ Program Files \ MySQL \ MySQL Server 5.0 \ bin; C: \ Program Files \ Tail4win; C: \ Program Files \ Overlook Fing 1.1 \ bin

Я хочу извлечь только следующий путь:

C: \ Program Files \ MySQL \ MySQL Server 5.0 \ bin;

Способен ли FOR на такое?


person Community    schedule 21.03.2009    source источник


Ответы (3)


Вы можете использовать for для токенизации в ;, но вам нужно позаботиться о путях, в которых есть ; (и, следовательно, нужны кавычки). В общем, я бы сказал, что на этом этапе вы создадите довольно хрупкое решение с довольно большим количеством кода.

Если вы хотите знать, где находится определенный исполняемый файл, тогда

for %%i in ("mysql.exe") do @echo.%%~$PATH:i

скажет вам это (или нет, если его нигде в PATH).

ОБНОВЛЕНИЕ: Хорошо, я понял. Вот один неприятный командный файл:

@echo off
setlocal enabledelayedexpansion enableextensions
set p=%PATH%
:loop
for %%i in ("notepad.exe") do call :setvar "%%~$p:i"
if not :%x%:==:: (call :clearpath & goto loop)
goto :eof

:setvar
    set x=%~1
goto :eof

:clearpath
    echo %x%
    for %%x in ("!x!") do set d=%%~dpx
    set d=!d:~,-1!
    set p=!p:%d%=!
goto :eof

Это напечатает все совпадающие пути из PATH, где был найден notepad.exe (первая программа, которую я знаю, находится здесь в двух местах). Адаптируйтесь соответственно к вашей проблеме.

:clearpath просто удаляет найденный путь из переменной, а затем мы снова пытаемся сопоставить, пока совпадение не останется.

Тем не менее, это все еще очень некрасиво.

person Joey    schedule 22.03.2009
comment
Спасибо! Ваш намек очень полезен - person ; 22.03.2009
comment
% ~ $ PATH: я ищу каталоги, перечисленные в переменной среды PATH, и раскрываю% I до полного имени первой найденной переменной. Если имя переменной среды не определено или файл не найден поиском, этот модификатор расширяется в пустую строку, если это так или иначе, чтобы получить - person ; 22.03.2009
comment
Я знаю, что говорят по этому поводу документы. В чем именно заключается ваш вопрос? - person Joey; 22.03.2009
comment
на пути есть серверная установка mysql, как вы можете видеть в вопросе% ~ $ PATH: я возвращаю только первую, как я могу получить остальную установку mysql с того же пути - person ; 22.03.2009
comment
в любом случае ваш совет был очень полезным, большое спасибо за вашу помощь, не беспокойтесь, я попробую - person ; 22.03.2009
comment
Добавил решение. Надеюсь, это поможет. - person Joey; 22.03.2009

Если вы уже знаете путь, зачем вам искать его в строке PATH?

Или, говоря другими словами, знаете ли вы способ распознать эту строку, учитывая, что она может различаться в разных установках?

person Daniel Earwicker    schedule 21.03.2009
comment
Я хочу сделать его максимально портативным, потому что я собираюсь применить его на нескольких серверах, и я думаю, что каждая установка имеет ванну mysql внутри% PATH% - person ; 22.03.2009
comment
Да, но когда пользователь устанавливает MySQL, может ли он выбрать любой путь установки? Если да, то как узнать, какая часть переменной PATH является путем установки MySQL? - person Daniel Earwicker; 22.03.2009
comment
Я не уверен в этом, но предполагаю, что mysql находится в% PATH% - person ; 22.03.2009

в качестве альтернативы вы можете использовать vbscript.

Set objFS=CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strSearch = objArgs(0)
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshPath = WshShell.Environment("SYSTEM")
strPath =WshPath("Path")

s = Split(strPath,";")
For i=LBound(s) To UBound(s)
    If InStr(1,s(i),strSearch,1) > 0 Then
        WScript.Echo s(i)
    End If 
Next    

сохраните указанное выше как findpath.vbs и используйте его в командной строке, чтобы найти любую строку, которую вы хотите, в переменной PATH:

c: \ test> cscript // нет findpath.vbs mysql

В пакетном файле для получения результатов используйте цикл for

person ghostdog74    schedule 08.01.2010