2009-03-21 6 views
2

Ich möchte einen vollständigen Pfad aus der Umgebungsvariablen PATH mit nativen Cmd-Tools extrahieren. Betrachten Sie die folgende PATH Inhalt:Wie kann ich einen vollständigen Pfad aus der Umgebungsvariablen PATH extrahieren?

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

Ich möchte nur den folgenden Pfad extrahieren:

C: \ Programme \ MySQL \ MySQL Server 5.0 \ bin;

Ist FOR so etwas in der Lage?

Antwort

4

Sie können for verwenden, um bei ; zu tokenisieren, aber Sie müssen auf Wege achten, die eine ; in ihnen haben (und benötigen Sie also Anführungszeichen). Alles in allem würde ich sagen, dass Sie an diesem Punkt eine ziemlich spröde Lösung mit ziemlich viel Code bauen würden.

Wenn Sie wissen möchten, wo eine bestimmte ausführbare Datei ist, dann

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

wird Ihnen sagen, dass (oder auch nicht, wenn es nirgendwo in der PATH).

UPDATE: Ok, ich habe es. Eine böse kleine Batch-Datei folgt:

@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 

Dadurch werden alle passenden Pfade von PATH drucken, wo notepad.exe gefunden wurde (das erste Programm, das ich die Spitze von meinem Kopf weiß aus hier in zwei Orten gleichzeitig zu sein). Passen Sie das Problem entsprechend an.

:clearpath löscht einfach den gefundenen Pfad aus der Variablen und dann versuchen wir erneut zu vergleichen, bis keine Übereinstimmung mehr übrig ist.

Das gesagt, das ist immer noch sehr un-hübsch.

+0

Vielen Dank Ihr Hinweis ist sehr hilfreich –

+0

% ~ $ PATH: Ich durchsucht die Verzeichnisse in der PATH-Umgebungsvariable und erweitert% I auf die vollqualifizierter Name des ersten gefunden.Wenn der Name der Umgebungsvariablen nicht definiert ist oder die Datei nicht von der Suche gefunden wird, dann wird dieser Modifikator auf die leere Zeichenfolge erweitert, wenn dies der Fall ist. –

+0

Ich weiß, was die Dokumente dazu sagen. Was genau ist deine Frage? – Joey

1

Wenn Sie den Pfad bereits kennen, warum müssen Sie ihn in der PATH-Zeichenfolge finden?

Oder anders gesagt, kennen Sie eine Möglichkeit, diese Zeichenfolge zu erkennen, da sie zwischen den Installationen variieren kann?

+0

Ich möchte es so tragfähig wie möglich machen, weil ich es auf mehreren Servern anwenden werde und ich denke, jede Installation hat mysql Bad in% PATH% –

+0

Ja, aber wenn der Benutzer installiert MySQL, dürfen sie irgendeinen Installationspfad wählen? Wenn ja, woher wissen Sie, welcher Teil der PATH-Variable der MySQL-Installationspfad ist? –

+0

Ich bin mir nicht sicher, aber ich nehme an, dass mysql sind in% PATH% –

1

Alternativ können Sie VBScript verwenden.

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  

speichern Sie die oben als findpath.vbs und es so in der Befehlszeile verwenden Sie eine beliebige Zeichenfolge innerhalb der PATH-Variablen finden wollen:

c: \ test> cscript // nologo findpath.vbs mysql

In einer Batch-Datei, erhalten die Ergebnisse, verwenden Sie eine For-Schleife