Есть ли эквивалент «который» в командной строке Windows? - PullRequest
2126 голосов
/ 20 ноября 2008

Поскольку у меня иногда возникают проблемы с путями, когда один из моих собственных сценариев cmd скрыт (затенен) другой программой (ранее на пути), я хотел бы иметь возможность найти полный путь к программе по команде Windows строка, дана только ее имя.

Есть ли эквивалент UNIX-команды 'which'?

В UNIX which command печатает полный путь данной команды, чтобы легко находить и устранять эти проблемы с тенями.

Ответы [ 23 ]

9 голосов
/ 26 марта 2010

Идите и получите unxutils отсюда: http://sourceforge.net/projects/unxutils/

gold на платформах Windows, помещает все замечательные утилиты Unix в стандартную Windows DOS. Пользуюсь им годами.

В него включено «которое». Обратите внимание, что он чувствителен к регистру.

Примечание: чтобы установить его, где-нибудь взорвите zip и добавьте ... \ UnxUtils \ usr \ local \ wbin \ в переменную env вашего системного пути.

8 голосов
/ 26 марта 2010

Если вы можете найти бесплатный компилятор 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.
7 голосов
/ 20 ноября 2008

Лучшая версия, которую я нашел в Windows - это утилита Джозефа Ньюкомера "whereis", которая доступна (с источником) на его сайте .

Статья о разработке "whereis" заслуживает прочтения.

7 голосов
/ 20 ноября 2008

Нет на складе Windows, но предоставляется Сервисами для Unix , и существует несколько простых пакетных скриптов, которые выполняют одно и то же, например этот .

6 голосов
/ 02 августа 2017

Сначала вы можете установить Git из Загрузка Git , а затем открыть Git Bash и набрать:

which app-name
6 голосов
/ 13 декабря 2017

Я использую GOW (GNU в Windows), который является облегченной версией Cygwin. Вы можете взять его с GitHub здесь .

GOW (GNU в Windows) - это легкая альтернатива Cygwin. Оно использует удобный установщик Windows, который устанавливает около 130 чрезвычайно полезные UNIX-приложения с открытым исходным кодом, скомпилированные как родной win32 двоичные файлы. Он должен быть как можно меньшего размера, около 10 МБ, как в отличие от Cygwin, который может работать более 100 МБ в зависимости от опции. - Описание (Брент Р. Мацель)

Снимок экрана со списком команд, включенных в GOW:

Enter image description here

6 голосов
/ 25 сентября 2016

Этот пакетный файл использует обработку переменных 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 /? для получения помощи.

6 голосов
/ 18 декабря 2014

Ни один из Win32-портов Unix, которые я смог найти в Интернете, не является удовлетворительным, поскольку у всех них есть один или несколько из этих недостатков:

  • Нет поддержки переменной Windows PATHEXT. (Который определяет список расширений, неявно добавляемых к каждой команде перед сканированием пути, и в каком порядке.) (Я использую много сценариев tcl, и ни один из общедоступных средств не может их найти.)
  • Нет поддержки кодовых страниц cmd.exe, из-за чего они неправильно отображают пути с символами, отличными от ascii. (Я очень чувствителен к этому, с ç в моем имени: -))
  • Нет поддержки отдельных правил поиска в cmd.exe и командной строке PowerShell. (Ни один из общедоступных инструментов не найдет сценарии .ps1 в окне PowerShell, но не в окне cmd!)

Так что в конце концов я написал свой собственный, который правильно поддерживает все вышеперечисленное.

Доступно там: http://jf.larvoire.free.fr/progs/which.exe

5 голосов
/ 20 ноября 2008

Я создал инструмент, похожий на Нед Батчелдер:

Поиск файлов .dll и .exe в PATH

Хотя мой инструмент предназначен в основном для поиска различных версий DLL, он отображает больше информации (дата, размер, версия), но не использует PATHEXT (я надеюсь вскоре обновить мой инструмент).

4 голосов
/ 02 сентября 2015

Для вас, пользователей Windows XP (у которых нет встроенной команды where), я написал команду "где как" в виде рубина, называемого whichr.

Чтобы установить его, установите Ruby.

Тогда

gem install whichr

Запустите как:

C:> whichr cmd_here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...