Як я можу "котрий <binary>" в cmd.exe


10

Чи є спосіб швидко визначити, де знаходиться бінарний (на який %PATH%вказує змінну).

Це те, що було б аналогічно which perlтрадиційній оболонці Unix.

Я розумію, що в Resource Kit є whereкоманда, але цей комплект не встановлений на моєму (корпоративному) комп'ютері, тому я не можу користуватися where.

Відповіді:


14

Одним з лайнерів cmd.exe whichбуде:

for %G in (<binary.exe>) do @echo.%~$PATH:G

Ви можете кодувати це як простий what.bat:

@echo off
for %%G in (%1) do @echo.%%~$PATH:G

EDIT: для цього потрібна повна назва двійкового файлу:, which perl.exenot which perl. Можна записати пакетний файл, який враховує% PATHEXT%, тому йому не потрібно повне ім'я двійкового файлу. Будь ласка, дайте мені знати, якщо вам це потрібно.

EDIT2: все одно я вирішив написати пакетний файл. Ось:

@echo off
setlocal enabledelayedexpansion

set ext= ;%PATHEXT%
:extloop1
for /f "delims=; tokens=1,*" %%A in ("!ext!") do (
  if exist %1%%A (
    echo .\%1%%A
    goto finish
  )
  set ext=%%B
)
if "!ext!" neq "" goto extloop1

set ext= ;%PATHEXT%
:extloop2
for /f "delims=; tokens=1,*" %%A in ("!ext!") do (
  for %%C in (%1%%A) do (
    if exist %%~$PATH:C (
      echo %%~$PATH:C
      goto finish
    )
  )
  set ext=%%B
)
if "!ext!" neq "" goto extloop2

:finish
endlocal

По-перше, згідно з попередженнями Боба, він перевіряє, чи існує бінарний файл у поточному каталозі. Якщо двійковий файл не знайдено, виконується інший цикл, який здійснює пошук через змінну% PATH%.

Цикли засновані на if ... goto, forкоманда використовується лише для розділення extзначення на ';' характер. Значення %PATHEXT%має попередньо порожнє розширення, яке дозволяє шукати повна назва бінарних файлів - і те, which perlі which perl.exeпрацює.


1
Ну, якщо ви все-таки пишете розширений пакетний файл, можливо, також пройдете весь шлях і .\binary.*спершу перевірте . Операційна система завжди шукає спочатку в поточному каталозі, перш ніж виконувати пошук каталогів у командному шляху.
Боб

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.