길고 관련된 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은 내부 명령입니다. [씨:\]
- Korn 쉘의 경우
ksh
,에서 사용 가능한SFUA 유틸리티 툴킷(에서 실행되는UNIX 기반 애플리케이션을 위한 하위 시스템Windows 7 Ultimate Edition 및 Windows Server 2008 R2와 함께 상자에 바로 포함되어 있음) 사용내장whence
명령. 이는 Korn 쉘의 별칭, 기능, 내장 명령 등을 이해합니다.$ 언제 -v ls ls는 /bin/ls에 대해 추적된 별칭입니다. $
- Bourne-Again 쉘의 경우
bash
,~처럼Unix 응용 프로그램용 서비스에 사용 가능Cygwin과 마찬가지로 내장type
명령을 사용하십시오. 이는 Boune-Again 쉘의 별칭, 기능, 내장 명령 등을 이해합니다.$ 유형 '[' [ 쉘이 내장되어 있습니다. $
- Microsoft의 명령 해석기의 경우
cmd
,당신은 운이 좋지 않습니다. 이 작업을 수행하기 위한 기본 제공 명령은 없습니다. 그리고 비록 고용할 수는 있지만외부경로 검색 알고리즘을 복제하는 명령은 별칭과 내장 명령을 반드시(또는 일반적으로) 인식하지 않습니다. 예: 다음은 GnuWin32which
명령 입니다.실패인식하려면dir
(위의 TCC 내장which
명령과 대조):C:\>어느 디렉토리 즉, (.;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem)에 디렉터리가 없습니다. 씨:\>
그리고 아래where
에 언급된 명령 은grawity
정확히 같은 방식으로 실패합니다.C:\>디렉토리 위치 정보: 해당 패턴에 대한 파일을 찾을 수 없습니다. 씨:\>
답변3
당신이 가지고 있다면GnuWin32그것은 다음과 같이 간단합니다:
which ObscureTool.exe
더 좋은 점은 이름만으로 호출하는 경우("ObscureTool"과 같은 확장자 없이) 여전히 올바른 것을 찾을 수 있다는 것입니다. 다음과 같은 경우 문제가 될 수 있습니다.둘"실행 가능" 파일: "ObscureTool.exe" 및 "ObscureTool.bat". 이 경우,어느발생하는 것을 찾을 것입니다첫 번째경로에서. 이 경우에는 ""라고만 말하면 됩니다.
which ObscureTool
답변4
powershell을 사용하면 다음을 사용할 수 있습니다.Get-Command tool.exe