2009-03-21 4 views
2

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

C: \ Program Files \ Windows Resource Kits \ Tools \; C: \ Perl \ сайт \ Bin; C: \ Perl \ Bin; C: \ WI NDOWS \ system32; C: \ WINDOWS; C: \ WINDOWS \ System32 \ Wbem; c: \ Program Files \ Microsoft SQ L Сервер \ 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 Файлы \ 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 \ бин

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

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

Действительно ли FOR способен на такое?

ответ

4

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

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

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 просто удаляет найденный путь из переменной, а затем мы снова пытаемся выполнить сопоставление, пока не осталось совпадений.

Это, все еще очень не очень красиво.

+0

Спасибо Ваш совет очень полезный –

+0

% ~ $ PATH: Я просматриваю каталоги, перечисленные в переменной PATH, и меняет% I на полное имя первого найденного. Если имя переменной окружения не определено или файл не найден при поиске, то этот модификатор расширяется до пустой строки, если это так или иначе, чтобы getrest –

+0

Я знаю, что говорят на этом документы. В чем ваш вопрос? – Joey

1

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

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

+0

Я хочу сделать его переносимым как можно больше, потому что я собираюсь применить его на нескольких серверах, и я думаю, что каждая установка содержит тупик mysql внутри% PATH% –

+0

Да, но когда пользователь устанавливает MySQL, разрешено ли им выбирать любой путь установки? Если да, то как вы узнаете, какой частью переменной PATH является путь установки MySQL? –

+0

Я не уверен в этом, но я буду считать, что mysql находится в% PATH% –

1

альтернативно, вы можете использовать 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  

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

C: \ тест> Cscript // NOLOGO findpath.vbs MySQL

В пакетном файле, чтобы получить результаты, используйте цикл for