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
which
Befehl. 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 eingebauterwhence
Befehl. 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 integriertentype
Befehl. 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-which
BefehlVersagenzu erkennendir
(im Gegensatz zum oben eingebauten TCC-which
Befehl):C:\>welches Verzeichnis welches: kein Verzeichnis in (.;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem) C:\>
Und hier ist der untenwhere
erwähnte Befehl,grawity
der 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