Wie kann ich den tatsächlichen Pfad zu einer EXE- oder BAT-Datei herausfinden?

Wie kann ich den tatsächlichen Pfad zu einer EXE- oder BAT-Datei herausfinden?

Wenn ich einen langen und komplizierten Pfad habe und den Namen eines Befehls eingebe, wie finde ich dann heraus, wo die EXE- oder BAT-Datei tatsächlich liegt? Ich dachte, TRUENAME würde das tun, aber es ist aus XP verschwunden und ich bin nicht sicher, ob es genau das getan hat, was ich wollte.

Ich möchte also tippen können

WHEREIS "Obscure Tool.exe"

und ich bekomme:

C:\Program Files\Obscure Tools Limited\Obscure Tool\Obscure Tool.exe

wenn der Ordner C:\Program Files\Obscure Tools Limited\Obscure Tool\auf meinem Pfad liegt. Wie heißt WHEREIS oder geht das auch mit einer Batch-Datei?

Antwort1

Hier ist eine Windows-Batchdatei, die Ihren Pfad nach einer Datei durchsucht. Ich habe sie unter XP und Win7 getestet.

Bitte haben Sie Verständnis dafür, dass eine Batch-/Befehlsdatei KEINE gute Lösung für dieses Problem darstellt, da die Zeichenfolgenmanipulation quälend langsam ist – aber anstelle eines kompilierten Tools wird dies Ihren Wünschen entsprechen.

Hoffentlich ist es ausreichend kommentiert, aber Sie können gerne Fragen stellen, wenn etwas einer Klärung bedarf.

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

rem -- SRC = Search value. Eg. notepad  or  notepad.exe
rem -- PAT = A copy of the path
rem -- SEP = PATH seperator
rem -- EXE = Executable file extensions
SET TMP_SRC=%1
SET TMP_PAT=%PATH%
SET TMP_SEP=;
SET TMP_EXE=exe com bat cmd

rem -- This is a batch file ...they are s-l-o-w
rem -- "<nul set /p=" does "echo" without a newline
<nul set /p =Searching...

:strLoop
    rem -- SUB = The first entry in the current PATH
    for /f "delims=%TMP_SEP%" %%s in ("!TMP_PAT!") do set TMP_SUB=%%s

    rem -- Progress update
    <nul set /p =.

    rem -- Check for the file exactly as specified on the command line
    if exist "!TMP_SUB!\%TMP_SRC%" (
        echo.
        echo Found "!TMP_SUB!\%TMP_SRC%"
        goto strDone
    )

    rem -- Check for the file with each of the selected executable extensions
    for %%x in (%TMP_EXE%) do (
        if exist "!TMP_SUB!\%TMP_SRC%.%%x" (
            echo.
            echo Found "!TMP_SUB!\%TMP_SRC%.%%x"
            goto strDone
        )
    )

    rem -- This loop chops off the first entry of the PATH
:subLoop
    rem -- CHR = First character of current PATH
    rem -- PAT -> All but the first character of the current PATH
    set TMP_CHR=!TMP_PAT:~0,1!
    set TMP_PAT=!TMP_PAT:~1!

    rem -- Have we exhausted the PATH?
    if "!TMP_PAT!" EQU "" goto strDone

    rem -- Have we just removed a PATH seperator?
    if "!TMP_CHR!" EQU "%TMP_SEP%" goto strLoop

    rem -- Keep stripping characters
    goto subLoop
:strDone

rem -- Cleanup
SET TMP_SRC=
SET TMP_PAT=
SET TMP_SEP=
SET TMP_SUB=
SET TMP_CHR=
SET TMP_EXE=

ENDLOCAL

Antwort2

Es hängt alles davon ab, welchen Kommandointerpreter man verwendet, und es gibt kein externes Dienstprogramm, das dies in allen Fällen richtig macht. Dies hat einen sehr wichtigen Grund:

Verschiedene Befehlsinterpreter suchen auf unterschiedliche Weise nach Befehlen.
Nur ein in jeden einzelnen Befehlsinterpreter integrierter Befehl weiß wirklich, was durch einen bestimmten Befehlsnamen aufgerufen wird.

  • FürTCC von JP Software, verwenden Sie einfachsein eingebauter whichBefehl. Dies versteht die Aliase, ausführbaren Erweiterungen und den Pfadsuchalgorithmus von TCC.
    [c:\]welches mspaint-Verzeichnis
    mspaint ist extern: C:\Windows\system32\mspaint.exe
    dir ist ein interner Befehl
    [C:\]
  • Für die Korn-Shell gilt ksh:verfügbar in derSFUA-Dienstprogramm-Toolkit(die in derSubsystem für UNIX-basierte Anwendungendas kommt direkt dort in der Box mit Windows 7 Ultimate Edition und Windows Server 2008 R2) verwendensein eingebauter whenceBefehl. Dies versteht die Aliase, Funktionen, integrierten Befehle usw. der Korn-Shell.
    $ woher -v ls
    ls ist ein verfolgter Alias ​​für /bin/ls
    $
  • Für die Bourne-Again-Shell, bash,alsverfügbar für Dienste für Unix-Anwendungensowie in Cygwin verwenden Sie den integrierten typeBefehl. Dieser versteht die Aliase, Funktionen, integrierten Befehle usw. der Boune-Again-Shell.
    $ Typ '['
    [ ist ein Shell-Builtin
    $
  • Für den Befehlsinterpreter von Microsoft cmd,dann hast du Pech. Es gibt keinen eingebauten Befehl dafür; und obwohl manexternBefehle, die den Pfadsuchalgorithmus replizieren, erkennen diese Befehle Aliase und integrierte Befehle nicht unbedingt (oder sogar normalerweise nicht). Beispiele: Hier ist der GnuWin32- whichBefehlVersagenzu erkennen dir(im Gegensatz zum oben eingebauten TCC- whichBefehl):
    C:\>welches Verzeichnis
    welches: kein Verzeichnis in (.;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem)
    C:\>
    Und hier ist der unten whereerwähnte Befehl, grawityder auf genau dieselbe Weise fehlschlägt:
    C:\>wobei du
    INFO: Für die angegebenen Muster konnten keine Dateien gefunden werden.
    C:\>

Antwort3

Wenn Sie habenGnuWin32es ist so einfach wie:

which ObscureTool.exe

Noch besser: Wenn Sie es nur mit dem Namen aufrufen (ohne Erweiterung, wie in „ObscureTool“), wird es trotzdem das Richtige finden. Dies könnte ein Problem sein, wenn Siezwei"ausführbare" Dateien: "ObscureTool.exe" und "ObscureTool.bat". In diesem FallWELCHEwird diejenige finden, die auftrittErsteim Pfad. In diesem Fall würden Sie lediglich sagen:

which ObscureTool

Antwort4

Mit Powershell können Sie denGet-Command tool.exe

verwandte Informationen