क्या विंडोज कमांड लाइन पर 'जो' के बराबर है?


2350

जैसा कि मुझे कभी-कभी पथ समस्याएँ होती हैं, जहाँ मेरी खुद की एक सीएमडी स्क्रिप्ट छिपी हुई है (छाया हुआ) दूसरे प्रोग्राम (पथ पर) से पहले, मैं विंडोज कमांड लाइन पर एक प्रोग्राम के लिए पूरा रास्ता खोजने में सक्षम होना चाहता हूँ, जो दिए गए हैं। बस इसका नाम है।

क्या यूनिक्स कमांड 'जो' के बराबर है?

UNIX पर, which commandइन शैडोइंग समस्याओं को आसानी से खोजने और सुधारने के लिए दिए गए कमांड का पूरा रास्ता प्रिंट करता है।


3
Foredecker: "जो" निष्पादन योग्य के लिए पथ खोजता है जिसे शेल प्रॉम्प्ट पर कमांड टाइप करने पर चलाया जाएगा।
ग्रेग हेवगिल

3
उदाहरण के लिए, यदि आपके पास जावा के 5 संस्करण स्थापित हैं और आप नहीं जानते हैं कि कौन सा प्रयोग किया जा रहा है, तो आप "कौन सा जावा" टाइप कर सकते हैं और यह आपको बाइनरी के लिए
पैठ

9
@Foredecker, MR का कहना है कि यह Win2k3 में "कहाँ" है, लेकिन Win2k3 प्रश्न का हिस्सा नहीं था। यदि "जहाँ" अन्य विंडोज संस्करणों में नहीं है, अन्य उत्तर भी मान्य हैं। IMNSHO, सभी विंडोज संस्करणों पर काम करने वाला उत्तर सबसे अच्छा है। इसके अलावा, अन्य उत्तर गलत नहीं हैं, बस इसे करने के विभिन्न तरीके।
paxdiablo

36
मुझे पता है कि यह प्रश्न सुपरयूज़र से पहले उत्पन्न हुआ था, लेकिन यह संभवतः वहां है।
पाल्सविम

16
whichमानक यूनिक्स में कोई कमांड नहीं है । POSIX उपयोगिता है type। सी शेल में एक कमांड है, और कुछ सिस्टम में बाहरी निष्पादन योग्य है। उदाहरण के लिए, डेबियन लिनक्स पर, whichनामक एक पैकेज से आता है debutils। यह बाहरी whichशेल-इन, एलियास या फ़ंक्शंस "शेल" नहीं देखता है। typeकर देता है; बैश के typeपास इसे दबाने का एक विकल्प है और बस एक पथ खोज करना है।
काज

जवाबों:


2549

विंडोज सर्वर 2003 और बाद में (यानी विंडोज एक्सपी 32 बिट के बाद कुछ भी) where.exeप्रोग्राम प्रदान करता है जो कुछ whichकरता है, हालांकि यह सभी प्रकार की फाइलों से मेल खाता है, न कि केवल निष्पादन योग्य कमांड। (यह बिल्ट-इन शेल कमांड की तरह मेल नहीं खाता cd।) यह वाइल्डकार्ड को भी स्वीकार करेगा, इसलिए where nt*आपकी %PATH%और वर्तमान निर्देशिका की सभी फाइलें ढूंढता है , जिनके नाम से शुरू होता है nt

where /?मदद के लिए प्रयास करें ।

ध्यान दें कि Windows PowerShell को परिभाषित करता है whereके लिए एक उपनाम के रूप cmdlet , इसलिए यदि आप चाहते हैं , आप के बजाय पूरा नाम टाइप करने के लिए छोड़ते हुए की जरूरत है विस्तार।Where-Objectwhere.exe.exe


30
नहीं, क्योंकि grep इसके इनपुट की सामग्री की जांच करता है , जिसे आपको स्पष्ट रूप से देना होगा। जो और जहाँ। केवल केवल PATH परिवेश चर में सेट निर्देशिकाओं के फ़ाइलों के नाम को देखते हैं ।
माइकल रतनपिन्थ

12
@ Ajedi32 - सही है, जो XP में नहीं है। जैसा कि मैंने कहा, "विंडोज सर्वर 2003 और बाद में"।
माइकल रतनपिन्था

24
Windows 8 में काम करता है
लूटने

57
देखना है कि इस powershell में अभ्यस्त काम जब तक आप टाइप where.exe
JonnyRaa

17
याद रखें कि where.exeएक शेल बिलिन नहीं है, आपको %windir%\system32अपने पास %PATH%होना चाहिए - जो मामला नहीं हो सकता है, जैसा whereकि सुझाव है कि आप अपने रास्ते के साथ समस्याओं पर काम कर रहे हैं!
टॉमस गैंडर

288

जबकि विंडोज के बाद के संस्करणों में एक whereकमांड है, तो आप पर्यावरण चर संशोधक का उपयोग करके विंडोज एक्सपी के साथ भी ऐसा कर सकते हैं:

c:\> for %i in (cmd.exe) do @echo.   %~$PATH:i
   C:\WINDOWS\system32\cmd.exe

c:\> for %i in (python.exe) do @echo.   %~$PATH:i
   C:\Python25\python.exe

आपको किसी अतिरिक्त उपकरण की आवश्यकता नहीं है और यह सीमित नहीं है PATHक्योंकि आप किसी भी पर्यावरण चर (पथ प्रारूप में, निश्चित रूप से) का विकल्प चुन सकते हैं जिसे आप उपयोग करना चाहते हैं।


और, यदि आप एक ऐसा तरीका चाहते हैं जो PATHEXT में सभी एक्सटेंशनों को संभाल सके (जैसा कि विंडोज़ स्वयं करता है), यह एक चाल करता है:

@echo off
setlocal enableextensions enabledelayedexpansion

:: Needs an argument.

if "x%1"=="x" (
    echo Usage: which ^<progName^>
    goto :end
)

:: First try the unadorned filenmame.

set fullspec=
call :find_it %1

:: Then try all adorned filenames in order.

set mypathext=!pathext!
:loop1
    :: Stop if found or out of extensions.

    if "x!mypathext!"=="x" goto :loop1end

    :: Get the next extension and try it.

    for /f "delims=;" %%j in ("!mypathext!") do set myext=%%j
    call :find_it %1!myext!

:: Remove the extension (not overly efficient but it works).

:loop2
    if not "x!myext!"=="x" (
        set myext=!myext:~1!
        set mypathext=!mypathext:~1!
        goto :loop2
    )
    if not "x!mypathext!"=="x" set mypathext=!mypathext:~1!

    goto :loop1
:loop1end

:end
endlocal
goto :eof

:: Function to find and print a file in the path.

:find_it
    for %%i in (%1) do set fullspec=%%~$PATH:i
    if not "x!fullspec!"=="x" @echo.   !fullspec!
    goto :eof

यह वास्तव में सभी संभावनाओं को लौटाता है लेकिन विशिष्ट खोज नियमों के लिए आप इसे आसानी से ट्विक कर सकते हैं।


7
अरे, काश मैंने ऐसा सीखा होता! बहुत बुरा यह MS-DOS या Win9x के साथ काम नहीं करता है (जो कि कमशॉट के साथ है)। (रेमंड चेन का एक अधिक "विस्तृत" संस्करण है जिसे आप एक बैच फ़ाइल में बदल सकते हैं: blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx )
माइकल रतनपिन्था

110
@ मिचेल, यदि आप अभी भी डॉस या Win95 का उपयोग कर रहे हैं, तो रास्ते में निष्पादन योग्य आपकी समस्याओं का कम से कम पता लगाना :-)
paxdiablo

विंडोज़ निष्पादन योग्य के रूप में .exe से अधिक को पहचानता है। पिछली बार मैंने whichW95 / DOS दिनों में एक बार वापस कोडित किया था, खोज क्रम था - वर्तमान dir, फिर प्रत्येक पथ dir, cmd.com के लिए, फिर cmd.exe, फिर cmd.bat तो, वर्तमान dir में cmd ​​.bat भी है बीफ्रोइ cmd.exe को रास्ते में ले जाया गया
Mawg का कहना है कि मोनिका

3
@mawg, मूल वह था जहाँ आप एक्सटेंशन जानते हैं क्योंकि यह दर्पण है जो UNIX के अंतर्गत है (जहाँ वह एक्सटेंशन-ऐडिंग प्रवंचना घटित नहीं होती है)। मैंने अब एक जोड़ा है जो आप कर सकते हैं, लेकिन यह एक स्क्रिप्ट के रूप में इतना सरल कमांड नहीं है। यह पहले एक्सटेंशन के प्रत्येक फिर अनडॉर्नड कमांड को आज़माता है। उम्मीद है की वो मदद करदे। आप अपनी आवश्यकताओं के अनुसार इसे फिट कर सकते हैं जैसा कि आप फिट देखते हैं (यदि आप उदाहरण के लिए विंडोज के साथ एक ही खोज क्रम चाहते हैं - यह सभी संभावनाओं को दर्शाता है)।
paxdiablo

2
इसे बैच स्क्रिप्ट में बदलने के लिए, "who.bat" नामक एक फ़ाइल बनाएं: @echo off for %%i in (%1) do @echo. %%~$PATH:%i इसे alias.bat स्क्रिप्ट में जोड़ने के लिए, जिसे आप हर बार लोड करते हैं जिसे आप cmd.exe चलाते हैं (उपरोक्त स्क्रिप्ट को C: \ usr नामक एक नई निर्देशिका में डालें) \ उपनाम): DOSKEY which=C:\usr\aliases\which.bat $* तब आप alias.bat फ़ाइल के साथ cmd.exe लॉन्च करने के लिए एक स्क्रिप्ट बना सकते हैं: cmd.exe /K E:\usr\aliases\alias.bat
ब्रैड टी।

151

PowerShell के तहत, Get-Commandकहीं भी निष्पादक पाएंगे $Env:PATH

Get-Command eventvwr

CommandType   Name          Definition
-----------   ----          ----------
Application   eventvwr.exe  c:\windows\system32\eventvwr.exe
Application   eventvwr.msc  c:\windows\system32\eventvwr.msc

यह $Env:PATHEXTवर्तमान शेल के लिए परिभाषित आदि के माध्यम से PowerShell cmdlets, फ़ंक्शन, उपनामों, कस्टम एक्ज़ीक्यूटेबल्स एक्सटेंशन के साथ फ़ाइलों आदि को भी ढूँढता है type -a foo- जो इसे अन्य उपकरणों की तुलना में बेहतर बनाते हैं where.exe, जैसे which.exe, आदि, जो इनसे अनजान हैं। पॉवरशेल कमांड।

नाम के केवल भाग का उपयोग करके निष्पादनयोग्य खोजना

gcm *disk*

CommandType     Name                             Version    Source
-----------     ----                             -------    ------
Alias           Disable-PhysicalDiskIndication   2.0.0.0    Storage
Alias           Enable-PhysicalDiskIndication    2.0.0.0    Storage
Function        Add-PhysicalDisk                 2.0.0.0    Storage
Function        Add-VirtualDiskToMaskingSet      2.0.0.0    Storage
Function        Clear-Disk                       2.0.0.0    Storage
Cmdlet          Get-PmemDisk                     1.0.0.0    PersistentMemory
Cmdlet          New-PmemDisk                     1.0.0.0    PersistentMemory
Cmdlet          Remove-PmemDisk                  1.0.0.0    PersistentMemory
Application     diskmgmt.msc                     0.0.0.0    C:\WINDOWS\system32\diskmgmt.msc
Application     diskpart.exe                     10.0.17... C:\WINDOWS\system32\diskpart.exe
Application     diskperf.exe                     10.0.17... C:\WINDOWS\system32\diskperf.exe
Application     diskraid.exe                     10.0.17... C:\WINDOWS\system32\diskraid.exe
...

कस्टम निष्पादनयोग्य ढूँढना

अन्य गैर-विंडोज़ निष्पादन योग्य (अजगर, रूबी, पर्ल, आदि) को खोजने के लिए, उन निष्पादन योग्य के लिए फ़ाइल एक्सटेंशन को PATHEXTपर्यावरणीय चर (चूक .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL) में जोड़ा जाना चाहिए, ताकि निष्पादन योग्य इन एक्सटेंशनों के साथ फ़ाइलों की पहचान हो सके PATH। जैसा कि Get-Commandइस चर का सम्मान भी करता है, इसे कस्टम निष्पादनयोग्य की सूची में बढ़ाया जा सकता है। जैसे

$Env:PATHEXT="$Env:PATHEXT;.dll;.ps1;.psm1;.py"     # temporary assignment, only for this shell's process

gcm user32,kernel32,*WASM*,*http*py

CommandType     Name                        Version    Source
-----------     ----                        -------    ------
ExternalScript  Invoke-WASMProfiler.ps1                C:\WINDOWS\System32\WindowsPowerShell\v1.0\Invoke-WASMProfiler.ps1
Application     http-server.py              0.0.0.0    C:\Users\ME\AppData\Local\Microsoft\WindowsApps\http-server.py
Application     kernel32.dll                10.0.17... C:\WINDOWS\system32\kernel32.dll
Application     user32.dll                  10.0.17... C:\WINDOWS\system32\user32.dll

आप जल्दी से sal which gcm(संक्षिप्त रूप set-alias which get-command) के साथ एक उपनाम स्थापित कर सकते हैं ।

अधिक जानकारी और उदाहरण के लिए ऑनलाइन मदद के तहत पाया जा सकता है Get-Command


2
यह केवल निष्पादनयोग्य से बहुत अधिक पाया जाता है। यह कमांड फाइलों को भी पकड़ता है
मैक्सिमिलियन बर्स्ज़ले

2
@ TheIncorrigible1 - यदि आप कमांड फाइल्स जैसे कि बैच फाइल्स ( .BAT, .CMDइत्यादि) का अर्थ रखते हैं, तो उन्हें निष्पादन योग्य माना जाता है क्योंकि उनके एक्सटेंशन को PATHEXTचर में नामित किया जाता है (जो कि डिफ़ॉल्ट रूप से होता है PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL)। अन्य निष्पादन योग्य प्रकार (जैसे .py, .rbआदि) फ़ाइल एक्सटेंशन को जोड़कर और assoc/ ftype- जैसे docs.python.org/3.3/use/…/
shalomb


40

यदि आपके पास PowerShell स्थापित है (जो मैं सुझाता हूं), तो आप निम्न कमांड का उपयोग किसी रफ़ समकक्ष के रूप में कर सकते हैं (आपके निष्पादन योग्य नाम के लिए वैकल्पिक नाम):

($Env:Path).Split(";") | Get-ChildItem -filter programName*

यहाँ और अधिक है: मेरा मैनविच! पॉवरशेल कौन सा


1
मैं इस सटीक पिथी पॉवर्सशेल कमांड की तलाश में था। मैं जहाँ। Exe का उपयोग कर रहा था, लेकिन त्रुटि कोड के साथ इसके आउटपुट को पार्स करने के शीर्ष पर गड़बड़ करने के लिए देशी शक्तियों के समाधान से बहुत कम है। धन्यवाद!
स्कोबी

9
लेकिन ($Env:Path).Split(";") | Get-ChildItem -filter programName*टाइप करना इतना आसान है ... ;-)
क्रेग

यह भी विफल हो जाता है यदि आपके पास आपके मार्ग में एक चर है जो सामान्य रूप से सिस्टम द्वारा हल किया जाता है (उर्फ% JAVA_HOME%)।
ड्रैगन 88 --88

मुझे काम करने के लिए कौनसा। Exe नहीं मिला, मैंने यह कोशिश की और यह काम कर गया।
असफंद काजी


24

विंडोज सीएमडी whichकॉल में where:

$ where php
C:\Program Files\PHP\php.exe

17

साइगविन एक समाधान है। यदि आप किसी तृतीय-पक्ष समाधान का उपयोग करने में कोई आपत्ति नहीं करते हैं, तो साइग्विन जाने का रास्ता है।

साइगविन आपको विंडोज वातावरण में * निक्स का आराम देता है (और आप इसे अपने विंडोज कमांड शेल में उपयोग कर सकते हैं, या अपनी पसंद के * निक्स शेल का उपयोग कर सकते हैं)। यह आपको whichविंडोज के लिए * nix कमांड (जैसे ) की पूरी मेजबानी देता है , और आप बस उस निर्देशिका को अपने में शामिल कर सकते हैं PATH


10
फेरुचियो द्वारा पहले उल्लेख किया गया GnuWin32 इस मामले में बहुत बेहतर है क्योंकि आप देशी जहां अकेले निष्पादन योग्य हो सकते हैं।
पायोत्र डोब्रोगोस्ट

GnuWin32 महान है, और मैं इसका उपयोग करता हूं, लेकिन यदि आप GnuWin32 टूल को स्थापित किए बिना इस कार्यक्षमता को चाहते हैं, जहां .NET सही कॉल की तरह लगता है। हालाँकि, मैं GnuWin32 टूल्स को अपने नेटवर्क पर a \ bin $ शेयर में रखता हूं ताकि मैं उन्हें वर्कस्टेशन (और बैच फ़ाइलों में) से उपयोग कर सकूं, जो उन्हें स्थानीय रूप से स्थापित नहीं है।
क्रेग

1
जब हम विंडोज में Cygwin उपयोग के बारे में बात करते हैं, तो मैं पसंद करता हूं: cygpath -w "` जो <appname> `"
mpasko256

12

PowerShell में, यह gcmअन्य कमांड के बारे में स्वरूपित जानकारी देता है। यदि आप निष्पादन योग्य के लिए केवल पथ को पुनः प्राप्त करना चाहते हैं, तो उपयोग करें .Source

उदाहरण के लिए: gcm gitया(gcm git).Source

छोटी-मोटी बातें:

  • विंडोज एक्सपी के लिए उपलब्ध है।
  • पॉवरशेल 1.0 से उपलब्ध है।
  • gcmGet-Commandcmdlet का एक उपनाम है ।
  • किसी भी पैरामीटर के बिना, यह होस्ट शेल द्वारा दिए गए सभी उपलब्ध आदेशों को सूचीबद्ध करता है।
  • आप इसके साथ एक कस्टम उपनाम बना सकते हैं Set-Alias which gcmऔर इसका उपयोग कर सकते हैं (which git).Source:।
  • आधिकारिक डॉक्स: https://technet.microsoft.com/en-us/library/ee176842.aspx

11

मेरे पास मेरे PowerShell प्रोफ़ाइल में एक फ़ंक्शन है जिसका नाम 'जो' है

function which {
    get-command $args[0]| format-list
}

यहाँ उत्पादन कैसा दिखता है:

PS C:\Users\fez> which python


Name            : python.exe
CommandType     : Application
Definition      : C:\Python27\python.exe
Extension       : .exe
Path            : C:\Python27\python.exe
FileVersionInfo : File:             C:\Python27\python.exe
                  InternalName:
                  OriginalFilename:
                  FileVersion:
                  FileDescription:
                  Product:
                  ProductVersion:
                  Debug:            False
                  Patched:          False
                  PreRelease:       False
                  PrivateBuild:     False
                  SpecialBuild:     False
                  Language:

अन्य समाधानों में से किसी ने भी मेरे लिए > get-command app.exe | format-listकाम नहीं किया लेकिन पूरी तरह से काम किया!
अलेक्जेंडर मैकफारलेन

10

यहाँ से unxutils प्राप्त करें: http://sourceforge.net/projects/unxutils/

विंडोज़ प्लेटफार्मों पर सोना, सभी अच्छे यूनिक्स उपयोगिताओं को एक मानक विंडोज़ डॉस पर रखता है। वर्षों से इसका उपयोग कर रहे हैं।

इसमें 'जो' शामिल है। ध्यान दें कि हालांकि यह संवेदनशील है।

NB: इसे स्थापित करने के लिए ज़िप को कहीं और विस्फोट करें ... अपने सिस्टम पथ env वेरिएबल में \ UnxUtils \ usr \ local \ wbin जोड़ें।


2
यह संवेदनशील नहीं है, मुझे यह भी कहना है कि किस जावा के बजाय java.exe - विंडोज़ 7
कल्पेश सोनी

हालांकि यह नई कहानियों के साथ करने के लिए निराशा की एक जोड़ी है; उदाहरण के लिए grep बिना ईओएल से मेल नहीं खाएगा .। यह 99% समाधान है, हालांकि यह सुनिश्चित है!
डैश-टॉम-बैंग

हां, यह मामला संवेदनशील नहीं है, हालांकि विंडोज में डिफ़ॉल्ट फ़ाइल नाम भी संवेदनशील नहीं हैं।
वर्नफ्राइड डॉमशेकिट

8

शेयर Windows में नहीं है, लेकिन यह द्वारा प्रदान की गई यूनिक्स के लिए सेवाएं और वहाँ कई सरल बैच के आसपास चल स्क्रिप्ट है कि एक ही बात इस तरह के पूरा कर रहे हैं यह एक


1
सिवाय इसके कि आप जिस लिंक को लिंक करते हैं वह केवल PATH वैरिएबल को आउटपुट करता है और यह भी जांच नहीं करता है कि फाइल वहां पाई गई है या नहीं।
एंजेल ओ स्फीयर

8

यदि आप एक नि: शुल्क पास्कल संकलक पा सकते हैं, तो आप इसे संकलित कर सकते हैं। कम से कम यह काम करता है और एल्गोरिथ्म को आवश्यक दिखाता है।

program Whence (input, output);
  Uses Dos, my_funk;
  Const program_version = '1.00';
        program_date    = '17 March 1994';
  VAR   path_str          : string;
        command_name      : NameStr;
        command_extension : ExtStr;
        command_directory : DirStr;
        search_dir        : DirStr;
        result            : DirStr;


  procedure Check_for (file_name : string);
    { Check existence of the passed parameter. If exists, then state so   }
    { and exit.                                                           }
  begin
    if Fsearch(file_name, '') <> '' then
    begin
      WriteLn('DOS command = ', Fexpand(file_name));
      Halt(0);    { structured ? whaddayamean structured ? }
    end;
  end;

  function Get_next_dir : DirStr;
    { Returns the next directory from the path variable, truncating the   }
    { variable every time. Implicit input (but not passed as parameter)   }
    { is, therefore, path_str                                             }
    var  semic_pos : Byte;

  begin
      semic_pos := Pos(';', path_str);
      if (semic_pos = 0) then
      begin
        Get_next_dir := '';
        Exit;
      end;

      result := Copy(Path_str, 1, (semic_pos - 1));  { return result   }
      { Hmm! although *I* never reference a Root drive (my directory tree) }
      { is 1/2 way structured), some network logon software which I run    }
      { does (it adds Z:\ to the path). This means that I have to allow    }
      { path entries with & without a terminating backslash. I'll delete   }
      { anysuch here since I always add one in the main program below.     }
      if (Copy(result, (Length(result)), 1) = '\') then
         Delete(result, Length(result), 1);

      path_str := Copy(path_str,(semic_pos + 1),
                       (length(path_str) - semic_pos));
      Get_next_dir := result;
  end;  { Of function get_next_dir }

begin
  { The following is a kludge which makes the function Get_next_dir easier  }
  { to implement. By appending a semi-colon to the end of the path         }
  { Get_next_dir doesn't need to handle the special case of the last entry }
  { which normally doesn't have a semic afterwards. It may be a kludge,    }
  { but it's a documented kludge (you might even call it a refinement).    }
  path_str := GetEnv('Path') + ';';

  if (paramCount = 0) then
  begin
    WriteLn('Whence: V', program_version, ' from ', program_date);
    Writeln;
    WriteLn('Usage: WHENCE command[.extension]');
    WriteLn;
    WriteLn('Whence is a ''find file''type utility witha difference');
    Writeln('There are are already more than enough of those :-)');
    Write  ('Use Whence when you''re not sure where a command which you ');
    WriteLn('want to invoke');
    WriteLn('actually resides.');
    Write  ('If you intend to invoke the command with an extension e.g ');
    Writeln('"my_cmd.exe param"');
    Write  ('then invoke Whence with the same extension e.g ');
    WriteLn('"Whence my_cmd.exe"');
    Write  ('otherwise a simple "Whence my_cmd" will suffice; Whence will ');
    Write  ('then search the current directory and each directory in the ');
    Write  ('for My_cmd.com, then My_cmd.exe and lastly for my_cmd.bat, ');
    Write  ('just as DOS does');
    Halt(0);
  end;

  Fsplit(paramStr(1), command_directory, command_name, command_extension);
  if (command_directory <> '') then
  begin
WriteLn('directory detected *', command_directory, '*');
    Halt(0);
  end;

  if (command_extension <> '') then
  begin
    path_str := Fsearch(paramstr(1), '');    { Current directory }
    if   (path_str <> '') then WriteLn('Dos command = "', Fexpand(path_str), '"')
    else
    begin
      path_str := Fsearch(paramstr(1), GetEnv('path'));
      if (path_str <> '') then WriteLn('Dos command = "', Fexpand(path_str), '"')
                          else Writeln('command not found in path.');
    end;
  end
  else
  begin
    { O.K, the way it works, DOS looks for a command firstly in the current  }
    { directory, then in each directory in the Path. If no extension is      }
    { given and several commands of the same name exist, then .COM has       }
    { priority over .EXE, has priority over .BAT                             }

    Check_for(paramstr(1) + '.com');     { won't return if file is found }
    Check_for(paramstr(1) + '.exe');
    Check_for(paramstr(1) + '.bat');

    { Not in current directory, search through path ... }

    search_dir := Get_next_dir;

    while (search_dir <> '') do
    begin
       Check_for(search_dir + '\' + paramstr(1) + '.com');
       Check_for(search_dir + '\' + paramstr(1) + '.exe');
       Check_for(search_dir + '\' + paramstr(1) + '.bat');
       search_dir := Get_next_dir;
    end;

    WriteLn('DOS command not found: ', paramstr(1));
  end;
end.

21
वाह, अभी भी पास्कल का उपयोग करने वाले लोग हैं? :-)
paxdiablo

6
मुझे लगता है कि वहाँ हैं। पर मैं नहीं। क्या आपने लाइन program_date = '17 मार्च 1994 'देखा;
मावग का कहना है कि मोनिका

1
इकाई आवश्यक my_funk;है। पास्कल कार्यक्रम पोस्ट करने के लिए धन्यवाद, मुझे मेरी युवावस्था की याद दिलाता है! यह ऐसी दया है कि पास्कल विकसित नहीं हुआ।
यानिस

2
ओह, लेकिन यह किया था। उदाहरण के लिए, यह अब ऑब्जेक्ट ओरिएंटेड है। Lazarus-ide.org पर एक महान निशुल्क, क्रॉस-प्लेटफ़ॉर्म, कार्यान्वयन और IDE है और बोरलैंड का एक प्रत्यक्ष वंशज अभी भी डेल्फी में embarcadero.com/products/delphi में रहता है जो कि स्टार्टर संस्करण के लिए $ 299 पर बहुत महंगा है (imo) और "प्रयोग करने योग्य" संस्करण के लिए $ 1k। हालांकि, यह क्रॉस प्लेटफॉर्म है - विंडोज़, आईओ, मैक, एंड्रॉइड। एक परीक्षण संस्करण प्राप्त करें या लाजर का उपयोग करें और 20 वर्ष से कम उम्र का महसूस करें, -)
मावग का कहना है कि मोनिका

1
@yannis "ऐसा अफ़सोस कि पास्कल विकसित नहीं हुआ" ... इसके अलावा 'टर्बो पास्कल' एंडर्स के लिए C # डिज़ाइन करने का मतलब है?
piers7

7

इसका सबसे अच्छा संस्करण मैंने विंडोज पर पाया है जोसेफ न्यूकमर की "एविस" उपयोगिता, जो उसकी साइट से उपलब्ध है (स्रोत के साथ) ।

"जहां" के विकास के बारे में लेख पढ़ने योग्य है।


1
देर से टिप्पणी: जिसमें विन 7 64-बिट के तहत 64-बिट निष्पादन योग्य खोजने के लिए समस्याएं हैं।
एक्सल केम्पर


6

यूनिक्स के Win32 बंदरगाहों में से कोई भी, जो मुझे इंटरनेट पर मिल सकता है, व्यंग्य कर रहे हैं, क्योंकि इन सभी में एक या एक से अधिक कमियां हैं:

  • Windows पथ चर के लिए कोई समर्थन नहीं। (जो पथ को स्कैन करने से पहले प्रत्येक कमांड में जोड़े जाने वाले एक्सटेंशन की सूची को परिभाषित करता है, और किस क्रम में है।) (मैं बहुत सी स्क्रिप्ट का उपयोग करता हूं, और सार्वजनिक रूप से उपलब्ध नहीं है कि कौन सा टूल उन्हें मिल सकता है।)
  • Cmd.exe कोड पृष्ठों के लिए कोई समर्थन नहीं है, जो उन्हें गैर-अस्की पात्रों के साथ गलत तरीके से पथ प्रदर्शित करता है। (मैं अपने पहले नाम :-) में ç के साथ बहुत संवेदनशील हूं)
  • Cmd.exe और PowerShell कमांड लाइन में अलग-अलग खोज नियमों के लिए कोई समर्थन नहीं। (कोई सार्वजनिक रूप से उपलब्ध उपकरण नहीं मिलेगा। PowerShell विंडो में .ps1 स्क्रिप्ट, लेकिन cmd विंडो में नहीं!)

इसलिए मैंने आखिरकार अपना खुद का लिखा, जो उपरोक्त सभी को सही ढंग से बताता है।

वहां उपलब्ध: http://jf.larvoire.free.fr/progs/which.exe


FYI करें मैंने अपना उल्लिखित टूल खोला है, जो ऊपर उल्लिखित है, और कई अन्य, github.com/JFLarvoire/SysToolsLib पर । आप वहां नवीनतम संस्करण प्राप्त कर सकते हैं, मुद्दों की रिपोर्ट कर सकते हैं, आदि
जीन-फ्रांस्वा लार्वोयर

6

यह बैच फ़ाइल उस कमांड को खोजने के लिए CMD वैरिएबल हैंडलिंग का उपयोग करती है जिसे पथ में निष्पादित किया जाएगा। ध्यान दें: कि वर्तमान निर्देशिका हमेशा पथ से पहले की जाती है) और जिसके आधार पर एपीआई कॉल का उपयोग किया जाता है अन्य मार्ग से पहले / बाद में खोजे जाते हैं।

@echo off
echo. 
echo PathFind - Finds the first file in in a path
echo ======== = ===== === ===== ==== == == = ====
echo. 
echo Searching for %1 in %path%
echo. 
set a=%~$PATH:1
If "%a%"=="" (Echo %1 not found) else (echo %1 found at %a%)

set /?मदद के लिए देखें ।


6

मैं GOW (Windows पर GNU) का उपयोग कर रहा हूं जो Cygwin का एक हल्का संस्करण है। आप इसे GitHub से यहां ले सकते हैं

GOW (विंडोज पर GNU) Cygwin का हल्का विकल्प है। यह एक सुविधाजनक विंडोज इंस्टॉलर का उपयोग करता है जो मूल win32 बायनेरिज़ के रूप में संकलित 130 अत्यंत उपयोगी ओपन सोर्स यूनिक्स अनुप्रयोगों को स्थापित करता है। यह संभव के रूप में छोटा होने के लिए डिज़ाइन किया गया है, लगभग 10 एमबी, सिगविन के विपरीत जो विकल्पों के आधार पर 100 एमबी से अधिक अच्छी तरह से चल सकता है। - विवरण के बारे में (ब्रेंट आर। मैत्ज़ेल)

GOW में शामिल आदेशों की सूची का स्क्रीनशॉट:

यहां छवि विवरण दर्ज करें


5

मैंने नेड बाचेल्ड के समान उपकरण बनाया है:

PATH में खोज .dll और .exe फ़ाइलें

जबकि मेरा टूल मुख्य रूप से विभिन्न dll संस्करणों की खोज के लिए है, यह अधिक जानकारी (दिनांक, आकार, संस्करण) दिखाता है, लेकिन यह PATHEXT (मैं अपने टूल को जल्द ही अपडेट करने की आशा करता हूं) का उपयोग नहीं करता हूं।


5

बस इस विंडोज 'एक लाइनर बैच फ़ाइल पोस्ट करने के लिए है:

C:>type wh.cmd
@for %%f in (%*) do for %%e in (%PATHEXT% .dll .lnk) do for %%b in (%%f%%e) do for %%d in (%PATH%) do if exist %%d\%%b echo %%d\%%b

एक परीक्षा:

C:>wh ssh
C:\cygwin64\bin\ssh.EXE
C:\Windows\System32\OpenSSH\\ssh.EXE

नहीं काफी एक एक लाइनर यदि आप में कोड लपेट setlocal enableextensionsऔर endlocal


2
कई लाइनों में पसंद करेंगे ताकि मैं इसे समझ सकूं। ;-)
ग्रिंगो सुवे

4

आपके लिए Windows XP उपयोगकर्ता (जिनके पास कोई whereकमांड बिल्ट-इन नहीं है), मैंने एक "जहाँ जैसा" कमांड को रूबीम कहा जाता हैwhichr

इसे स्थापित करने के लिए, रूबी को स्थापित करें।

फिर

gem install whichr

इसे ऐसे चलाएं:

C:> जोr cmd_here


3
मुझे संदेह है कि आपको नीचे उतारा जा रहा है क्योंकि आप Windows XP पर कुछ भी करने का सुझाव दे रहे हैं।
सेबस्टियन-सी

1
खराब नहीं किया, लेकिन एक तुच्छ आदेश को लागू करने के लिए रूबी को स्थापित करना एक कठिन बेचना है। ऊपर एक लूप है जिसे बैच स्क्रिप्ट में डाला जा सकता है।
ग्रिंगो सुवे

2
यदि आप इसे वर्बोज़ मोड में चलाते हैं, तो यह द लाइकर के थीम गीत के लिए शुरुआती लाइनों को प्रिंट करता है? ;)
एजी हैमर्थीफ

3

JPSoft से TCC और TCC / LE महत्वपूर्ण कार्यक्षमता जोड़ने वाले CMD.EXE प्रतिस्थापन हैं। ओपी के प्रश्न के लिए प्रासंगिक, whichटीसीसी परिवार कमांड प्रोसेसर के लिए एक अंतर्निहित कमांड है।


2

मैंने whichकाफी समय से npm से मॉड्यूल का उपयोग किया है , और यह बहुत अच्छी तरह से काम करता है: https://www.npmjs.com/package/which यह एक बेहतरीन मल्टी प्लेटफॉर्म विकल्प है।

अब मैं whichGit के साथ आता है। बस अपने रास्ते को /usr/binगिट से जोड़ दें , जो आमतौर पर है C:\Program Files\Git\usr\bin\which.exewhichद्विआधारी पर किया जाएगा C:\Program Files\Git\usr\bin\which.exe। यह तेज है और उम्मीद के मुताबिक काम भी करता है।


1

इसे इस्तेमाल करे

set a=%~$dir:1
If "%for%"=="" (Echo %1 not found) else (echo %1 found at %a%)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.