it-swarm.asia

هل هناك ما يعادل "أيهما" في سطر أوامر Windows؟

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

هل هناك ما يعادل أمر يونيكس "أي"؟

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

2107
namin

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

جرب where /? للحصول على المساعدة.

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

2313
Michael Ratanapintha

بينما تحتوي الإصدارات الأحدث من Windows على أمر 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 (كما يفعل Windows نفسه) ، فإن هذا الملحق يقوم بالخدعة:

@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

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

274
paxdiablo

ضمن 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

كما أنه يجد أوامر cmdlets من PowerShell والوظائف والأسماء المستعارة والملفات التي لها امتدادات قابلة للتنفيذ مخصصة عبر $Env:PATHEXT وما إلى ذلك محددة لـ Shell الحالي (يشبه إلى حد كبير Bash's type -a foo) - مما يجعلها أفضل من أدوات أخرى مثل where.exe و which.exe غير مدركين لأوامر PowerShell هذه.

البحث عن الملفات التنفيذية باستخدام جزء فقط من الاسم

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
...

العثور على الملفات التنفيذية المخصصة

للعثور على الملفات التنفيذية الأخرى بخلاف windows (python ، و Ruby ، ​​و Perl ، إلخ) ، يجب إضافة امتدادات الملفات الخاصة بهذه الملفات التنفيذية إلى المتغير البيئي 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 .

126
shalomb

في Windows PowerShell:

set-alias which where.exe
51
cmcginty

إذا كان لديك PowerShell مثبتة (الذي أوصي به) ، يمكنك استخدام الأمر التالي كمكافئ تقريبي (اسم بديل للبرنامج لاسم القابل للتنفيذ الخاص بك):

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

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

38
RexE

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

33
Ferruccio

في Windows CMD which يدعو where:

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

Cygwin هو الحل. إذا كنت لا تمانع في استخدام حل تابع لجهة خارجية ، فإن Cygwin هو السبيل للذهاب.

يمنحك Cygwin راحة * nix في بيئة Windows (ويمكنك استخدامه في أمر Windows الخاص بك Shell أو استخدام * nix Shell من اختيارك). يمنحك مجموعة كاملة من أوامر * nix (مثل which) لنظام التشغيل Windows ، ويمكنك فقط تضمين هذا الدليل في PATH.

16
palswim

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

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

الحكايات:

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

لدي وظيفة في ملفي الشخصي في 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:
10
Fez

انتقل للحصول على unxutils من هنا: http://sourceforge.net/projects/unxutils/

الذهب على منصات ويندوز ، ويضع جميع المرافق نيس يونيكس على دوس ويندوز القياسية. تم استخدامه لسنوات.

لديها "التي" المدرجة. لاحظ أنه حساس لحالة الأحرف بالرغم من ذلك.

ملاحظة: لتثبيته تنفجر الرمز البريدي في مكان ما وإضافة ...\UnxUtils\usr\local\wbin\إلى متغير env مسار النظام الخاص بك.

9
Jon Court

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

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.
8
Mawg

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

7
Robert Gamble

أفضل إصدار من هذا أجده على Windows هو أداة "whereis" الخاصة بـ Joseph Newcomer ، والتي تتوفر (مع مصدر) من موقعه .

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

7
Tim Lesher

يستخدم هذا الملف الدفعي معالجة متغير 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
user6017774

لا يوجد أي من منافذ Win32 الخاصة بـ Unix والتي يمكنني أن أجدها على شبكة الإنترنت هي عبارة عن إشباع ، لأنها جميعًا بها واحد أو أكثر من هذه العيوب:

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

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

متاح هناك: http://jf.larvoire.free.fr/progs/which.exe

6
Jean-François Larvoire

أنا أستخدم GOW (GNU على Windows) وهو إصدار خفيف من Cygwin. يمكنك الحصول عليها من GitHub هنا .

GOW (GNU على Windows) هو بديل خفيف الوزن لـ Cygwin. يستخدم مثبّت Windows مناسبًا يقوم بتثبيت حوالي 130 من تطبيقات UNIX مفتوحة المصدر المفيدة للغاية والتي تم تجميعها على أنها ثنائيات win32 أصلية. تم تصميمه ليكون أصغر ما يمكن ، حوالي 10 ميغابايت ، مقابل Cygwin التي يمكن أن تعمل أكثر من 100 ميغابايت اعتمادًا على الخيارات. - حول الوصف (برنت ر. ماتزيل)

لقطة شاشة لقائمة الأوامر المضمّنة في GOW:

 Enter image description here

6
Prayson W. Daniel

لقد قمت بإنشاء أداة مشابهة لـ Ned Batchelder:

البحث عن ملفات .dll و .exe في PATH

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

5
Michał Niklas

يمكنك أولاً تثبيت Git منتنزيل Git، ثم فتح Git Bash واكتب:

which app-name
5
hamidreza samsami

بالنسبة إلى مستخدمي Windows XP (الذين ليس لديهم أمر where مضمن) ، لقد كتبت أمر "حيث أعجبني" كـ rubygem يسمى whichr.

لتثبيته ، قم بتثبيت روبي.

ثم

gem install whichr

تشغيله مثل:

C:> whor cmd_here

3
rogerdpack

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

3
David G

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

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

2
Giovanni Bassi

جرب هذا

set a=%~$dir:1
If "%for%"=="" (Echo %1 not found) else (echo %1 found at %a%)
1
FeZZo