Как извлечь полный путь из переменной среды PATH? - PullRequest
2 голосов
/ 22 марта 2009

Я хочу извлечь полный путь из переменной среды 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 \ Инструменты \ 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 Файлы \ Tail4win; C: \ Program Files \ Overlook Fing 1.1 \ bin

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

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

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

Ответы [ 3 ]

4 голосов
/ 22 марта 2009

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

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

1 голос
/ 08 января 2010

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

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

1 голос
/ 22 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...