Как извлечь полный путь из переменной среды 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: \ Программные файлы \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:\ программные файлы \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 in\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 способен на такое?

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

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

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

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

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

Другие вопросы по тегам