سؤال

نظرًا لأنني أواجه أحيانًا مشكلات في المسار، حيث يتم إخفاء أحد برامج cmd النصية الخاصة بي (مظلل) بواسطة برنامج آخر (في وقت سابق من المسار)، أود أن أتمكن من العثور على المسار الكامل لبرنامج ما في سطر أوامر Windows، نظرًا فقط اسمها.

هل هناك ما يعادل أمر UNIX "الذي"؟

على يونيكس، which command يطبع المسار الكامل للأمر المحدد للعثور على مشكلات التظليل هذه وإصلاحها بسهولة.

هل كانت مفيدة؟

المحلول

وWindows Server 2003 و في وقت لاحق (أي أي شيء بعد ويندوز إكس بي 32 بت) توفير برنامج where.exe التي لا بعض ما which يفعل، على الرغم من أنه يطابق جميع أنواع الملفات، وليس فقط الأوامر القابلة للتنفيذ. (لا تطابق الأوامر قذيفة المدمج في مثل cd.) وسوف تقبل حتى البدل، لذلك يجد where nt* جميع الملفات في %PATH% والدليل الحالي التي تبدأ مع nt الأسماء.

وحاول where /? للمساعدة.

لاحظ أن ل Windows PowerShell يعرف where كاسم مستعار ل وWhere-Object cmdlet ل ، لذلك إذا كنت تريد where.exe، تحتاج إلى كتابة الاسم الكامل بدلا من إهمال تمديد .exe.

نصائح أخرى

وبينما الإصدارات الأحدث من ويندوز لديها قيادة where، يمكنك أيضا القيام بذلك مع نظام التشغيل Windows XP باستخدام بيئة المعدلات المتغيرة، على النحو التالي:

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

وانها فعلا بإرجاع كافة الاحتمالات ولكن يمكنك قرص عليه بسهولة تامة لقواعد البحث محددة.

وتحت بوويرشيل، <وأ href = "https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Core/Get-Command؟view=powershell-5.1" يختلط = "noreferrer" > 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

ويجدها أيضا أوامر cmdlets بوويرشيل، وظائف، والأسماء المستعارة، والملفات مع الملفات التنفيذية مخصصة الإضافات عبر $Env:PATHEXT، الخ محددة لقذيفة الحالية (تشبه الى حد بعيد ل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 .

في ل Windows PowerShell:

set-alias which where.exe

إذا كان لديك بوويرشيل تثبيت (التي أوصي)، يمكنك استخدام الأمر التالي كما تعادل الخام (programName بديلا عن اسم قابل للتنفيذ الخاص بك):

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

المزيد هنا: بلدي Manwich! بوويرشيل التي

أدوات GnuWin32 ديك which، جنبا إلى جنب مع مجموعة كاملة من أدوات يونكس الأخرى.

في ويندوز يدعو CMD which where:

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

سيغوين هو الحل. إذا كنت لا تمانع في استخدام الحل طرف ثالث، ثم سيغوين هو الطريق للذهاب.

وسيغوين يمنحك راحة * لا شىء في بيئة ويندوز (ويمكنك استخدامه في حياتك قيادة قذيفة ويندوز، أو استخدام * قذيفة لا شىء من اختيارك). فهو يوفر لك مجموعة كاملة من الأوامر * لا شىء (مثل which) لويندوز، والتي يمكن أن تشمل فقط هذا الدليل في PATH الخاص بك.

في PowerShell، هو كذلك gcm, ، والذي يوفر معلومات منسقة حول الأوامر الأخرى.إذا كنت تريد استرداد المسار الوحيد للملف القابل للتنفيذ، فاستخدم .Source.

على سبيل المثال: gcm git أو (gcm git).Source

الحكايات:

  • متاح لنظام التشغيل Windows XP.
  • متوفر منذ PowerShell 1.0.
  • gcm هو اسم مستعار ل Get-Command cmdlet.
  • بدون أي معلمات، فهو يسرد جميع الأوامر المتاحة التي تقدمها الصدفة المضيفة.
  • يمكنك إنشاء اسم مستعار مخصص باستخدام Set-Alias which gcm واستخدامها مثل: (which git).Source.
  • المستندات الرسمية: https://technet.microsoft.com/en-us/library/ee176842.aspx

والذهاب الحصول unxutils من هنا: http://sourceforge.net/projects/unxutils/

والذهب على أنظمة تشغيل ويندوز، ويضع جميع المرافق يونيكس لطيفة على ويندوز القياسية DOS. تم استخدامه لسنوات.

ولديه 'الذي' المدرجة. تجدر الإشارة إلى أن قضية حساسة بالرغم من ذلك.

ملحوظة: لتثبيته تفجير البريدي في مكان ما وإضافة ... \ UnxUtils \ البيرة \ المحلية \ wbin \ لديك متغير النظام مسار الحياة الفطرية

ولدي وظيفة في ملفه بوويرشيل لي اسمه 'التي'

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:

إذا يمكنك العثور على مترجم باسكال المجاني، يمكنك تجميع هذه. على الأقل كان يعمل ويظهر الخوارزمية اللازمة.

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.

ليس متوفرًا في مخزون Windows ولكن يتم توفيره بواسطة خدمات ليونكس وهناك العديد من البرامج النصية الدفعية البسيطة التي تنجز نفس الشيء مثل هذا هذا.

وأفضل نسخة من هذا لقد وجدت على ويندوز هو جوزيف الوافد الجديد "whereis" المنفعة، والذي يتوفر (مع المصدر) من <لأ href = "http://www.flounder.com/whereis.htm" يختلط = "noreferrer"> موقعه .

والمقالة حول تطوير "whereis" تستحق القراءة.

لا يوجد أي من منافذ Win32 لنظام Unix التي يمكن أن أجدها على الإنترنت مرضية، لأنها جميعها بها واحد أو أكثر من أوجه القصور هذه:

  • لا يوجد دعم لمتغير Windows PATHEXT.(الذي يحدد قائمة الامتدادات المضافة ضمنيًا إلى كل أمر قبل مسح المسار، وبأي ترتيب.) (أستخدم الكثير من نصوص tcl، ولا توجد أداة متاحة للعامة يمكنها العثور عليها.)
  • لا يوجد دعم لصفحات الرموز cmd.exe، مما يجعلها تعرض المسارات بأحرف غير ascii بشكل غير صحيح.(أنا حساس جدًا لذلك، مع حرف ç في اسمي الأول :-))
  • لا يوجد دعم لقواعد البحث المميزة في cmd.exe وسطر أوامر PowerShell.(لن تتمكن أي أداة متاحة للعامة من العثور على نصوص برمجية بتنسيق .ps1 في نافذة PowerShell، ولكن ليس في نافذة cmd!)

لذلك كتبت في النهاية كتابي الذي يدعم كل ما سبق بشكل صحيح.

متوفر هناك:http://jf.larvoire.free.fr/progs/what.exe

وهذا الملف الدفعي يستخدم CMD التعامل مع المتغير للعثور على الأوامر التي سوف يتم تنفيذها في المسار. ملاحظة: أن الدليل الحالي يتم دائما قبل الطريق) واعتمادا على والذي يستخدم استدعاء API مواقع أخرى يتم البحث قبل / بعد مسار

@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 /? للمساعدة.

ويمكنك تثبيت بوابة أولا من تحميل بوابة ، و ثم فتح بوابة باش واكتب:

which app-name

وأستخدمه GOW (GNU على ويندوز) الذي هو نسخة خفيفة من سيغوين. يمكنك الاستيلاء عليها من جيثب هنا .

<اقتباس فقرة>   

وGOW (GNU على نظام التشغيل Windows) هو البديل خفيفة الوزن لسيغوين. ويستخدم   ويندوز المثبت مريحة الذي يثبت حوالي 130 للغاية   تطبيقات UNIX المصدر المفتوح مفيدة تجميعها وWin32 وأصلي   الثنائيات. وهي مصممة لتكون صغيرة قدر الإمكان، حوالي 10 MB، كما   بدلا من سيغوين التي يمكن تشغيلها أكثر من 100 MB اعتمادا على   خيارات. - عن وصف (برنت R. Matzelle)

لقطة شاشة لائحة من الأوامر المدرجة في GOW:

ولقد خلق أداة مماثلة لنيد باتشلدر:

البحث .dll و ملفات إكس في PATH

وبينما أداة بلدي هو primarly للبحث من مختلف الإصدارات دلل فإنه يدل على مزيد من المعلومات (التاريخ والحجم وإصدار) لكنها لا تستخدم PATHEXT (آمل لتحديث أداة بلدي قريبا).

للك مستخدمي ويندوز XP (الذين ليس لديهم قيادة where مدمجة)، وقد كتبت "حيث مثل" القيادة باعتباره rubygem دعا whichr.

لتثبيته، تركيب روبي.

ثم

gem install whichr

وتشغيله مثل:

وC:> whichr cmd_here

وTCC وTCC / LE من JPSoft هي بدائل CMD.EXE التي تضيف وظائف كبيرة. ذات الصلة على سؤال OP، وwhich هو أمر مدمج لTCC المعالجات قيادة الأسرة.

ولقد استخدمت وحدة which من الآلية الوقائية الوطنية لفترة طويلة، وأنها تعمل بشكل جيد جدا: الشبكي: //www.npmjs.com/package/which وهو بديل منصة متعددة كبير.

والآن تحولت إلى which التي تأتي مع جيت. فقط إضافة إلى المسار مسار /usr/bin من بوابة، التي عادة ما تكون في C:\Program Files\Git\usr\bin\which.exe. سوف ثنائي which تكون على C:\Program Files\Git\usr\bin\which.exe. وهو أسرع وأيضا يعمل كما هو متوقع.

وهذه محاولة

set a=%~$dir:1
If "%for%"=="" (Echo %1 not found) else (echo %1 found at %a%)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top