EXE ファイルまたは BAT ファイルへの実際のパスを調べるにはどうすればよいですか?

EXE ファイルまたは BAT ファイルへの実際のパスを調べるにはどうすればよいですか?

長くて複雑な PATH があり、何らかのコマンドの名前を入力した場合、EXE ファイルまたは BAT ファイルが実際に存在する場所をどのように見つければよいでしょうか。TRUENAME がこれを行うと思っていたのですが、XP からは削除されており、それがまさに私が望んでいることを実行するかどうかはわかりません。

だから私は入力できるようになりたい

WHEREIS "Obscure Tool.exe"

そして次のようになります:

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

フォルダーがC:\Program Files\Obscure Tools Limited\Obscure Tool\パス上にある場合。WHEREIS は何と呼ばれますか、それともバッチ ファイルで実行できますか?

答え1

以下は、パス内のファイルを検索する Windows バッチ ファイルです。XP と Win7 でテストしました。

文字列操作が非常に遅いため、バッチ/コマンド ファイルはこの問題に対する適切な解決策ではないことをご理解ください。ただし、コンパイルされたツールの代わりに、これは必要なことを実行します。

十分にコメントされていることを願いますが、何か明確にする必要がある場合は遠慮なく質問してください。

@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

答え2

すべては、実行しているコマンド インタープリタに依存しており、すべての場合にこれを適切に実行する外部ユーティリティはありません。これには、非常に重要な理由があります。

コマンドインタープリターによってコマンドの検索方法は異​​なります。
個々のコマンド インタープリターに組み込まれたコマンドだけが、特定のコマンド名によって何が呼び出されるかを正確に認識します。

  • のためにJPソフトウェアのTCC、単に組み込みwhichコマンドこれは、TCC のエイリアス、実行可能拡張子、およびパス検索アルゴリズムを理解します。
    [c:\]どのmspaintディレクトリ
    mspaint は外部です: C:\Windows\system32\mspaint.exe
    dirは内部コマンドです
    [c:\]
  • Kornシェルの場合ksh入手可能なSFUA ユーティリティ ツールキット(これはUNIX ベース アプリケーション用サブシステムWindows 7 UltimateエディションおよびWindows Server 2008 R2に同梱されている組み込みwhenceコマンドこれは、Korn シェルのエイリアス、関数、組み込みコマンドなどを理解します。
    $ wherece -v ls
    lsは/bin/lsの追跡されたエイリアスです
    $
  • Bourne-Againシェルの場合bashとしてUnixアプリケーション向けサービスで利用可能Cygwin と同様に、組み込みtypeコマンドを使用します。これにより、Boune-Again シェルのエイリアス、関数、組み込みコマンドなどが認識されます。
    $ タイプ '['
    [はシェル組み込み関数です
    $
  • Microsoftのコマンドインタープリタの場合cmd残念ながら、これを行うための組み込みコマンドはありません。外部のパス検索アルゴリズムを複製するコマンドは、必ずしも(または通常は)エイリアスや組み込みコマンドを認識しません。例:GnuWin32whichコマンドは次のとおりです。失敗認識するdir(上記の TCC の組み込みwhichコマンドとは対照的):
    C:\>どのディレクトリ
    which: (.;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem) にディレクトリがありません
    C:\>
    そして、以下whereで言及されているコマンドもgrawityまったく同じ方法で失敗します。
    C:\>どこのディレクトリ
    情報: 指定されたパターンのファイルが見つかりませんでした。
    C:\>

答え3

あなたが持っている場合GNUWin32 のそれは次のように簡単です:

which ObscureTool.exe

さらに良いことに、名前だけで呼び出すと(「ObscureTool」のように拡張子なしで)、正しいものを見つけます。これは、「実行可能」ファイル:「ObscureTool.exe」および「ObscureTool.bat」。この場合、どれの発生するものを見つける初めパスに。この場合、単に「

which ObscureTool

答え4

PowerShellを使用すると、Get-Command tool.exe

関連情報