Из-за количества каталогов, которые вы можете поместить в переменную среды% PATH%, очень легко иметь непреднамеренные конфликты между именами приложений. Я поклялся, что встречал этот совет раньше, но я не могу найти его где-нибудь. Есть ли способ в командной строке увидеть каталог, в котором находится приложение? Например, я ищу что-то вроде следующего:

C:\> xcopy
Invalid number of parameters
0 File(s) copied

C:\> **SOME_COMMAND** xcopy
C:\Windows\System32\xcopy.exe

5 ответов5

4

Where.exe - это эквивалент Windows в Windows. Если вы используете Windows Server 2003+ или Vista+, этот инструмент устанавливается в% windir%/System32. Использование "где" в командной оболочке (cmd.exe) показывает результаты в порядке поиска путей:

C:\> where where
C:\Windows\System32\where.exe

Помните, что PowerShell обычно использует псевдоним «где» для Where-Object, поэтому вам просто нужно включить «.exe» при вызове куда из PowerShell:

C:\> where.exe where
C:\Windows\System32\where.exe

Также смотрите Windows эквивалент Где?

2

Вот простой файл ванны, который будет делать то, что вы хотите.

@for %%e in (%PATHEXT%) do @for %%i in (%1%%e) do @if NOT "%%~$PATH:i"=="" echo %%~$PATH:i

whereis xcopy - работает whereis xcopy.exe - не будет работать

Надеюсь, это поможет (несколько)

С уважением

1

Инструменты UNIX GNU доступны в портах Windows, вам не нужно проходить через сценарии, как описано выше. Команда which работает при наличии xcopy или xcopy.exe или других исполняемых файлов, включая BAT-файлы. Их можно скачать с:

http://gnuwin32.sourceforge.net/packages.html

Они очень удобны.

1

Немного тяжелый, но если вам нравится командная строка в Windows, вы должны попробовать Cygwin. Поместите его в папку \bin в PATH, и у вас будет целый набор отличных инструментов, не в последнюю очередь, which , которые точно скажут вам, какой файл вы будете выполнять :)

(И да, я понимаю иронию добавления в свой PATH, чтобы помочь с тем, что там слишком много)

редактировать: это также может быть уместно.

1

Основываясь на ответах Мика и Фоши, я нашел решение, которое искал. Я создал скрипт AutoIt, который перебирает все PATHEXT и PATH, чтобы найти первое место, где находится передаваемый параметр. Он обрабатывает как параметры расширения, так и расширения. Сначала он ищет локальный рабочий каталог, а затем переменные среды. Что касается всего, что я прочитал, это то, как Windows выполняет поиск и для этой команды. Вот сценарий:

If $CmdLine[0] > 0 Then
    $commandToFind = $CmdLine[1]
    $matchFound = false
    $foundPath = ""
    $pathEnvironmentVariable = EnvGet("PATH")
    $pathDirectories = StringSplit($pathEnvironmentVariable, ";", 2)
    $pathExtensionsEnvironmentVariable = EnvGet("PATHEXT")
    $pathExtensions = StringSplit($pathExtensionsEnvironmentVariable, ";", 2)

    ; Search the local directory first for the file
    If FileExists($commandToFind) Then
        $matchFound = true
        $foundPath = @WorkingDir & "\" & $commandToFind
    EndIf

    For $pathExtension In $pathExtensions
        $fullPath = @WorkingDir & "\" & $commandToFind & StringLower($pathExtension)
        If FileExists($fullPath) Then
            $matchFound = true
            $foundPath = $fullPath
            ExitLoop
        EndIF
    Next

    If Not $matchFound == true Then
        ; Loop through all the individual directories located in the PATH environment variable
        For $pathDirectory In $pathDirectories
            If FileExists($pathDirectory) Then
                $pathWithoutExtension = $pathDirectory & "\" & $commandToFind

                ; Check if the command exists in the current path. Most likely the parameter had the extension passed in
                If FileExists($pathWithoutExtension) Then
                    $matchFound = true
                    $foundPath = $pathWithoutExtension
                    ExitLoop
                EndIf

                If Not $matchFound == true Then
                    ; Loop through all possible system extensions to see if the file exists.
                    For $pathExtension In $pathExtensions
                        $fullPath = $pathWithoutExtension & StringLower($pathExtension)
                        If FileExists($fullPath) Then
                            $matchFound = true
                            $foundPath = $fullPath
                            ExitLoop
                        EndIf
                    Next
                EndIf

                If $matchFound == true Then
                    ExitLoop
                EndIf
            EndIf
        Next
    EndIf
    If $matchFound == true Then
        ConsoleWrite("Located at " & $foundPath & @CRLF)
    Else
        ConsoleWriteError("Unable to locate the command" & @CRLF)
    EndIf
EndIf

Чтобы заставить его работать, вам нужно запустить его через программу Aut2exe.exe, которая поставляется с AutoIt (ярлык называется Compile Script to .exe) и проверить «Консоль?"флажок при его компиляции. Я просто компилирую его в файл с именем «which.exe», который я добавляю в существующий каталог путей (например, C:\Windows\System32).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .