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




command-line path-variables (14)

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

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

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


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


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


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

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

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



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

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

ثم

gem install whichr

تشغيله مثل

c:\>whichr cmd_here


تحت 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

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

يمكنك بسرعة إعداد اسم مستعار مع sal which gcm (نموذج قصير من set-alias which get-command ).


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

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


في 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 powershell:

set-alias which where.exe

في حين أن الإصدارات اللاحقة من 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

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


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

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

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

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


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






path-variables