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




command-line path-variables (17)

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

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

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

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

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

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

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


بالنسبة إلى مستخدمي XP (الذين ليس لديهم أمر مضمن) ، فقد كتبت أمر "where like" على أنه rubygem يُدعى whichr

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

ثم

gem install whichr

تشغيله مثل

c:\>whichr cmd_here


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

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

الحكايات:

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

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

جرب where /? للمساعدة.

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



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

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

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


دونو إذا كان هذا يساعد. نشر كإجابة لأنني لا أعرف كيفية تنسيق التعليمات البرمجية في التعليقات (مساعدة؟)

إذا كان يمكنك العثور على مترجم باسكال مجاني ، يمكنك تجميع هذا ، أو مراسلتي عبر البريد الإلكتروني ويمكنني محاولة حفر واحد ، أو إرسال بريد إلكتروني إكس أو نشره في مكان ما. إنني أنشر الرمز ، كما هو سيئ ، لأنه على الأقل يعمل ويعرض الخوارزمية الضرورية.

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 existance 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 thru 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 تحتوي على أمر 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

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


في windows powershell:

set-alias which where.exe

لدي وظيفة في ملف التعريف الخاص بي في 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:

أنا باستخدام GOW (Gnu على نظام التشغيل Windows) وهو نسخة خفيفة من cygwin. يمكنك فصله من جيثب here.

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

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


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


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

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

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

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


ليس في الأوراق المالية ويندوز ولكن يتم توفيرها من قبل خدمات ل UNIX وهناك العديد من البرامج النصية دفعة بسيطة تطفو حول تحقيق ذلك الشيء نفسه من هذا القبيل هذا واحد .


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


في Windows CMD which يستدعي where :

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







path-variables