如何从PATH环境变量中提取完整路径?

时间:2009-03-21 23:35:33

标签: windows batch-file scripting cmd

我想使用native cmd工具从PATH环境变量中提取完整路径。请考虑以下PATH内容:

  

C:\ Program Files \ Windows资源工具包\ 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是否有能力做这件事?

3 个答案:

答案 0 :(得分:4)

您可以使用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 :(得分:1)

如果您已经知道路径,为什么需要在PATH字符串中找到它?

或者换句话说,你知道一种识别字符串的方法,因为它可能因安装而异吗?

答案 2 :(得分: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    

将上面的内容保存为findpath.vbs并在命令行中使用它,以便在PATH变量中找到所需的任何字符串:

C:\试验> cscript // nologo findpath.vbs mysql

在批处理文件中,要获得结果,请使用for循环