windows - файла - управление через командную строку




Есть ли эквивалент «which» в командной строке Windows? (15)

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

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

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


TCC и TCC / LE от JPSoft - это замены CMD.EXE, которые добавляют значительную функциональность. Релевантно к вопросу OP, which является встроенной командой для командных процессоров семейства TCC.


Windows Server 2003 и более поздние версии (т.е. что-либо после 32-разрядной версии Windows XP) предоставляют программу where.exe которая выполняет некоторые действия, хотя и соответствует всем типам файлов, а не только исполняемым командам. (Он не соответствует встроенным командам оболочки, например, cd .) Он даже примет подстановочные знаки, поэтому where nt* находит все файлы в вашем %PATH% и в текущем каталоге, чьи имена начинаются с nt .

Попробуйте, where /? за помощью.

Обратите внимание, что Windows PowerShell определяет, where в качестве псевдонима для командлета Where-Object , поэтому, если вы хотите where.exe , вам нужно ввести полное имя, а не .exe расширение .exe .


В PowerShell это gcm , который дает форматированную информацию о других командах. Если вы хотите получить только путь к исполняемому файлу, используйте .Source .

Например: gcm git или (gcm git).Source

Tidbits:

  • Доступно для Windows XP.
  • Доступно с PowerShell 1.0.
  • gcm - это псевдоним командлета Get-Command .
  • Без каких-либо параметров он перечисляет все доступные команды, предлагаемые оболочкой хоста.
  • Вы можете создать пользовательский псевдоним с Set-Alias which gcm и использовать его как: (which git).Source .
  • Официальные документы: https://technet.microsoft.com/en-us/library/ee176842.aspx

В Windows CMD, which вызывает, where :

$ where php
C:\Program Files\PHP\php.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 (что я рекомендую), вы можете использовать следующую команду в качестве грубого эквивалента (имя подстановки для имени вашего исполняемого файла):

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

Подробнее здесь: http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx


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

Статья о развитии «whereis» стоит прочитать.


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


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

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

Поэтому я, в конце концов, написал свой собственный, который правильно подтверждает все вышеизложенное.

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


У инструментов GnuWin32 есть все, which связано с другими инструментами Unix.


У меня есть функция в моем профиле PowerShell с именем 'which'

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:

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


Я долгое время использовал модуль из npm, и он работает очень хорошо: https://www.npmjs.com/package/which Это отличная альтернатива для нескольких платформ.

Теперь я переключился на то, что приходит с Гит. Просто добавьте к вашему пути путь /usr/bin из Git, который обычно находится в C:\Program Files\Git\usr\bin\which.exe . Бинарный файл будет находиться в C:\Program Files\Git\usr\bin\which.exe . Это быстрее и работает так, как ожидалось.


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

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

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







path-variables