ฉันจะ“ ไหน <binary> "ใน cmd.exe


10

มีวิธีในการกำหนดอย่างรวดเร็วว่าที่ตั้งของไบนารี (ที่%PATH%ตัวแปรชี้ไป) อยู่ที่ไหน

นั่นคือสิ่งที่จะทำเทียบเท่ากับwhich perlในยูนิกซ์เชลล์แบบดั้งเดิม

ฉันเข้าใจว่าชุดทรัพยากรมีwhereคำสั่ง แต่ชุดนี้ไม่ได้ติดตั้งบนคอมพิวเตอร์ของฉัน (บริษัท ) ดังนั้นฉันจึงไม่สามารถใช้งานwhereได้

คำตอบ:


14

cmd.exe หนึ่งซับสำหรับwhichจะเป็น:

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

คุณสามารถเขียนมันเป็นไฟล์ง่ายๆ

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

แก้ไข: มันต้องมีชื่อเต็มของไบนารี: ไม่which perl.exe which perlเป็นไปได้ที่จะเขียนแบตช์ไฟล์ที่คำนึงถึง% PATHEXT% เข้ามาดังนั้นจึงไม่จำเป็นต้องใช้ชื่อเต็มของไบนารี โปรดแจ้งให้เราทราบหากคุณต้องการ

แก้ไข 2: อย่างไรก็ตามฉันตัดสินใจที่จะเขียนไฟล์แบตช์ นี่มันคือ:

@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

ครั้งแรกตามความแออัดของ Bob จะตรวจสอบว่าไบนารีอยู่ในไดเรกทอรีปัจจุบัน หากไม่พบไบนารีจะมีการดำเนินการลูปอื่นซึ่งทำการค้นหาผ่านตัวแปร% PATH%

ลูปจะขึ้นอยู่กับif ... goto, forคำสั่งที่ใช้เพียงเพื่อที่จะแบ่งextค่าโดย ';' ตัวละคร ค่าของ%PATHEXT%ถูกเติมด้วยส่วนขยายที่ว่างซึ่งอนุญาตให้ค้นหาไบนารีที่มีชื่อเต็ม - ทั้งwhich perlและใช้which perl.exeงานได้


1
ถ้าคุณเขียนไฟล์แบตช์แบบขยายก็อาจไปตลอดทางและตรวจสอบ.\binary.*ก่อน ระบบปฏิบัติการค้นหาในไดเรกทอรีปัจจุบันก่อนเสมอก่อนที่จะค้นหาไดเรกทอรีในเส้นทางคำสั่ง
บ๊อบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.