windows - উইন্ডোজ কমান্ড লাইনে কি 'সমান' আছে?




command-line path-variables (15)

যেহেতু মাঝে মাঝে আমার কোনও পথ সমস্যা থাকে, যেখানে আমার নিজের সিএমডি স্ক্রিপ্টগুলির একটি অন্য প্রোগ্রাম (আগে পথ) লুকানো (ছায়াচ্ছন্ন) হয়, আমি উইন্ডোজ কমান্ড লাইনে একটি প্রোগ্রামের পুরো পথ খুঁজে পেতে সক্ষম হব শুধু তার নাম।

ইউনিক্স কমান্ডের সমতুল্য কোনটি 'যা'?

ইউনিক্সে, which command সহজে এই শ্যাডোনিং সমস্যাগুলির সন্ধান এবং মেরামত করার জন্য প্রদত্ত কমান্ডের সম্পূর্ণ পথ প্রিন্ট করে।


Dunno এই সাহায্য করে। উত্তর হিসেবে পোস্ট করা হয়েছে কারণ আমি জানি না মন্তব্যগুলিতে কোডটি কীভাবে বিন্যাস করতে হবে (সাহায্য?)

যদি আপনি একটি বিনামূল্যে পাস্কাল কম্পাইলার খুঁজে পেতে পারেন, তবে আপনি এটি সংকলন করতে পারেন, অথবা আমাকে ইমেল করতে পারেন এবং আমি একটিকে খনন করার চেষ্টা করতে পারি, অথবা EXE কে মেলাতে বা এটি কোথাও পোস্ট করতে পারি। আমি কোড পোস্ট করি, খারাপ হিসাবে এটি, কারণ অন্তত এটি কাজ করে এবং অ্যালগরিদম প্রয়োজনীয় দেখায়।

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.

JPSoft থেকে TCC এবং TCC / LE সিএমডি.EXE প্রতিস্থাপন যা উল্লেখযোগ্য কার্যকারিতা যোগ করে। OP এর প্রশ্নের সাথে প্রাসঙ্গিক, which TCC পরিবার কমান্ড প্রসেসরগুলির জন্য একটি অন্তর্নির্মিত কমান্ড।


PowerShell এ, এটি gcm , যা অন্যান্য কমান্ডগুলির সম্পর্কে বিন্যাসিত তথ্য দেয়। আপনি এক্সিকিউটেবল শুধুমাত্র পথ পুনরুদ্ধার করতে চান, ব্যবহার .Source.Source

উদাহরণস্বরূপ: gcm git বা (gcm git).Source

টুকরো অংশ:

  • উইন্ডোজ এক্সপি জন্য উপলব্ধ।
  • PowerShell 1.0 থেকে পাওয়া যায়।
  • gcm হ'ল Get-Command cmdlet এর একটি উপনাম।
  • কোনো পরামিতি ছাড়াই, হোস্ট শেল দ্বারা দেওয়া সমস্ত উপলব্ধ কমান্ডগুলি তালিকাভুক্ত করে।
  • আপনি Set-Alias which gcm সাথে একটি কাস্টম উপনাম তৈরি করতে পারেন Set-Alias which gcm এবং এটি ব্যবহার করে: (which git).Source
  • অফিসিয়াল ডক্স: https://technet.microsoft.com/en-us/library/ee176842.aspx

আপনার জন্য এক্সপি ব্যবহারকারীরা (যাদের কোনও কমান্ড নেই), আমি একটি "রাইটস" কমান্ড লিখেছি যা whichr নামে whichr

এটি ইনস্টল করতে, Ruby ইনস্টল করুন

তারপর

gem install whichr

এটা মত চালানো

c:\>whichr cmd_here


আমার পাওয়ারশেল প্রোফাইলে একটি ফাংশন আছে যা 'যা'

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) যা সাইগুইনের একটি হালকা সংস্করণ। আপনি here. github থেকে এটি আড়াল করতে পারেন here.

Gow (উইন্ডোজ নেভিগেশন Gnu) সিগুইন লাইটওয়েট বিকল্প। এটি একটি সুবিধাজনক উইন্ডোজ ইনস্টলার ব্যবহার করে যা 130 টি অত্যন্ত দরকারী ওপেন সোর্স ইউনিক্স অ্যাপ্লিকেশনগুলিকে স্থানীয় Win32 বাইনারি হিসাবে সংকলিত করে। এটি সাইগুইনের বিপরীতে যতটা সম্ভব ছোট, 10 এমবি পর্যন্ত ডিজাইন করা হয়েছে যা বিকল্পগুলির উপর নির্ভর করে 100 মেগাবাইটেরও বেশি ভাল চালাতে পারে। - বর্ণনা সম্পর্কে (ব্রেন্ট আর। মাতজেল)

কমান্ড একটি তালিকা স্ক্রিনশট GOW অন্তর্ভুক্ত।


আমি বেশ কিছুক্ষণ npm থেকে which মডিউল ব্যবহার করেছি, এবং এটি খুব ভালভাবে কাজ করে: https://www.npmjs.com/package/which এটি একটি দুর্দান্ত মাল্টি প্ল্যাটফর্ম বিকল্প।

এখন আমি জিট দিয়ে which সুইচ। শুধু গিট থেকে /usr/bin পাথে আপনার পথটি যোগ করুন, যা সাধারণতঃ C:\Program Files\Git\usr\bin\which.exewhich বাইনারিটি C:\Program Files\Git\usr\bin\which.exe । এটা দ্রুত এবং প্রত্যাশিত হিসাবে কাজ করে।


ইউনিক্সের Win32 পোর্টগুলির মধ্যে কোনটিই আমি ইন্টারনেটে খুঁজে পাচ্ছি না সেগুলি সাধুবাদযুক্ত, কারণ তাদের সবার মধ্যে এক বা একাধিক ত্রুটি রয়েছে:

  • উইন্ডোজ PATHEXT পরিবর্তনশীল জন্য কোন সমর্থন। (যা পথ স্ক্যান করার আগে এবং কোন ক্রমে স্ক্যান করার আগে প্রতিটি কমান্ডে এক্সটেনশানগুলির তালিকাটিকে সংজ্ঞায়িত করে এক্সটেনশানগুলির তালিকা সংজ্ঞায়িত করে।) (আমি অনেকগুলি টিএলসি স্ক্রিপ্ট ব্যবহার করি এবং কোনও সরঞ্জামটি সর্বজনীনভাবে উপলভ্য করতে পারে যা তাদের খুঁজে পেতে পারে।)
  • Cmd.exe কোড পৃষ্ঠাগুলির জন্য কোনও সমর্থন নেই, যা তাদের অ-অ্যাসি অক্ষরগুলি ভুলভাবে প্রদর্শন করে। (আমি যে খুব সংবেদনশীল, ç আমার প্রথম নাম :-))
  • Cmd.exe এবং PowerShell কমান্ড লাইনের স্বতন্ত্র অনুসন্ধান নিয়মগুলির জন্য কোনও সমর্থন নেই। (কোনও সার্বজনিকভাবে উপলভ্য সরঞ্জামটি পাওয়ারশেল উইন্ডোতে .ps1 স্ক্রিপ্ট খুঁজে পাবে না, তবে একটি cmd উইন্ডোতে নয়!)

তাই আমি অবশেষে আমার নিজের লেখাটি লিখেছিলাম, যেটি উপরের সব ঠিকঠাক উপায়ে।

সেখানে উপলব্ধ: http://jf.larvoire.free.fr/progs/which.exe


উইন্ডোজ এর পরবর্তী সংস্করণগুলির একটি কমান্ড রয়েছে, তবে আপনি এটিকে পরিবেশগত পরিবর্তনশীল মোডিফায়ারগুলি ব্যবহার করে উইন্ডোজ এক্সপির সাথে এটি করতে পারেন:

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

এটি আসলে সব সম্ভাবনার ফেরত দেয় তবে আপনি নির্দিষ্ট অনুসন্ধানের নিয়মগুলির জন্য এটি বেশ সহজেই টুইক করতে পারেন।


উইন্ডোজ ক্ষমতাশালী মধ্যে:

set-alias which where.exe

উইন্ডোজ সিএমডি এ which কল করে:

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

এই ব্যাচ ফাইলটি সিএমডি পরিবর্তনশীল হ্যান্ডলিং ব্যবহার করে যা কমান্ডটিকে কার্যকর করা হবে। দ্রষ্টব্য: বর্তমান ডিরেক্টরি সবসময় পথের আগে সম্পন্ন করা হয়) এবং কোন API 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 /? দেখুন set /? সাহায্যের জন্য.


বিস্মিত যে কেউ এখনো সমাধান হিসাবে সাইগুইনকে উল্লেখ করেনি। তৃতীয় পক্ষের সমাধান ব্যবহার করে আপনি যদি মনে করেন না তবে সাইগুইন যাওয়ার উপায়।

সিগুইন আপনাকে উইন্ডোজ পরিবেশে * নিক্সের আরাম দেয় (এবং আপনি এটি আপনার উইন্ডোজ কমান্ড শেলে ব্যবহার করতে পারেন, অথবা আপনার পছন্দের একটি * নিক্স শেল ব্যবহার করতে পারেন)। এটি আপনাকে উইন্ডোজের জন্য * নিক্স কমান্ডগুলির ( which ) পুরো হোস্ট দেয়, এবং আপনি কেবল আপনার PATH সেই ডিরেক্টরিটি অন্তর্ভুক্ত করতে পারেন।


যদি আপনার কাছে PowerShell ইনস্টল করা থাকে (যা আমি সুপারিশ করি), আপনি নিম্নোক্ত কমান্ডটিকে সমান সমতুল্য হিসাবে ব্যবহার করতে পারেন (আপনার এক্সিকিউটেবলের নামের জন্য উপাদানের প্রোগ্রাম নাম):

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

আরো এখানে: http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx , http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx , http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx


GnuWin32 সরঞ্জামগুলি which অন্যান্য ইউনিক্স সরঞ্জামগুলির সাথে সম্পূর্ণভাবে মিলিত হয়েছে।








path-variables