長くて複雑な 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