Поиск файла по пути

Кто-нибудь знает, как определить местоположение файла, который находится в одной из папок, указанных переменной среды PATH, кроме выполнения dir filename.exe / s из корневой папки?

Я знаю, что это выходит за рамки вопроса о программировании, но это полезно для проблем, связанных с развертыванием, также мне нужно изучить зависимости исполняемого файла. :-)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
16
0
13 816
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Вы можете использовать утилиту where.exe в каталоге C:\Windows\System32.

Спасибо - коротко, но мило, я знал, что для этого есть простой инструмент командной строки ...!

ljs 12.10.2008 19:20

Для какой ОС? Я не могу найти "where.exe" в своей системе Windows XP.

Patrick Cuff 13.10.2008 16:18

WHERE.EXE поставляется с Windows XP Server 2003 и выше, а также с наборами ресурсов Windows начиная с Windows 2000. Он также включен в VS2005, но не в 2008 (C: \ Program Files \ Microsoft Visual Studio 8 \ Common7 \ Tools \ Bin \ Where.Exe).

raven 13.10.2008 22:42

В Windows я бы сказал, используйте %WINDIR%\system32\where.exe

В заголовке вашего вопроса не указаны окна, поэтому я полагаю, что некоторые люди могут найти этот вопрос в поисках того же, имея в виду ОС Posix (например, я).

Этот фрагмент php может им помочь:

<?php
function Find( $file )
{
    foreach( explode( ':', $_ENV( 'PATH' ) ) as $dir )
    {
        $command = sprintf( 'find -L %s -name "%s" -print', $dir, $file );
        $output  = array();
        $result  = -1;
        exec( $command, $output, $result );

        if ( count( $output ) == 1 )
        {
            return( $output[ 0 ] );
        }
    }
    return null;
}
?>

Это немного измененный производственный код, который я запускаю на нескольких серверах. (т.е. вырвано из объектно-ориентированного контекста и оставлено для краткости некоторая очистка и проверка ошибок.)

Теперь я знаю, но не видел тега до того, как опубликовал

Kris 12.10.2008 19:50

это все еще полезно, спасибо! Иногда я использую unix.

ljs 12.10.2008 20:44

просто для удовольствия, вот однострочная реализация powershell

 function PSwhere($file) { $env:Path.Split(";") | ? { test-path $_$file* } }

Это не работает, поскольку пути в PATH могут также содержать ; (и тогда они цитируются).

Joey 01.04.2011 14:22

В дополнение к утилитам which (MS Windows) и where (unix / linux) я написал свою собственную утилиту, которую я назвал findinpath. В дополнение к поиску исполняемого файла в, который будет выполнен, если его передать интерпретатору командной строки (CLI), он найдет все совпадения, вернет порядок поиска пути, чтобы вы могли найти проблемы порядка пути. Кроме того, моя утилита возвращает не только исполняемые файлы, но и любые совпадения со спецификациями файла, чтобы уловить те моменты, когда желаемый файл на самом деле не является исполняемым.

Я также добавил функцию, которая оказалась очень изящной; флаг -s указывает ему искать не только системный путь, но и все на системном диске, за исключением известных пользовательских каталогов. Я обнаружил, что эта функция невероятно полезна в задачах системного администрирования ...

Вот результат "использования":

usage: findinpath [ -p <path> | -path <path> ] | [ -s | -system ] <file>
   or  findinpath [ -h | -help ]

where: <file> may be any file spec, including wild cards

       -h or -help returns this text

       -p or -path uses the specified path instead of the PATH environment variable.

       -s or -system searches the system disk, skipping /d /l/ /nfs and /users

Написать такую ​​утилиту несложно, и я оставлю ее в качестве упражнения для читателя. Или, если спросят здесь, я отправлю свой сценарий - он находится в 'bash'.

Если вы хотите найти файл на уровне API, вы можете использовать PathFindOnPath. У него есть дополнительный бонус, заключающийся в возможности указывать дополнительные каталоги, если вы хотите выполнить поиск в дополнительных местах, помимо системного или текущего пути пользователя.

Для систем на базе WindowsNT:

for %i in (file) do @echo %~dp$PATH:i

Замените file именем искомого файла.

+1 одно из немногих мест, где поисковые системы предложили решение, которое работает без сторонних инструментов. Благодарность!

Jeroen Wiert Pluimers 19.10.2009 12:28

вы можете заменить $ PATH любой переменной $ environmentVariable, а также искать небинарные файлы. Как раз то, что мне было нужно!

Jeroen Wiert Pluimers 19.10.2009 12:29

Используйте for %e in (%PATHEXT%) do @(for %x in (file%e) do @if not "%~$PATH:x"= = "" @echo.%~$PATH:x), если вы не знаете расширение.

Joey 01.04.2011 14:15

Использование PowerShell в Windows ...

Function Get-ENVPathFolders {
#.Synopsis Split $env:Path into an array
#.Notes 
#  - Handle 1) folders ending in a backslash 2) double-quoted folders 3) folders with semicolons 4) folders with spaces 5) double-semicolons i.e. blanks
#  - Example path: 'C:\WINDOWS\;"C:\Path with semicolon; in the middle";"E:\Path with semicolon at the end;";;C:\Program Files;
#  - 2018/01/30 by [email protected] - Created
$NewPath = @()
$env:Path.ToString().TrimEnd(';') -split '(?=["])' | ForEach-Object { #remove a trailing semicolon from the path then split it into an array using a double-quote as the delimeter keeping the delimeter
    If ($_ -eq '";') { # throw away a blank line
    } ElseIf ($_.ToString().StartsWith('";')) { # if line starts with "; remove the "; and any trailing backslash
        $NewPath += ($_.ToString().TrimStart('";')).TrimEnd('\')
    } ElseIf ($_.ToString().StartsWith('"')) {  # if line starts with " remove the " and any trailing backslash
        $NewPath += ($_.ToString().TrimStart('"')).TrimEnd('\') #$_ + '"'
    } Else {                                    # split by semicolon and remove any trailing backslash
        $_.ToString().Split(';') | ForEach-Object { If ($_.Length -gt 0) { $NewPath += $_.TrimEnd('\') } }
    }
}
Return $NewPath
}

$myFile = 'desktop.ini'
Get-ENVPathFolders | ForEach-Object { If (Test-Path -Path $_$myFile) { Write-Output "Found [$_$myFile]" } } 

Я также опубликовал ответ с некоторыми подробностями на http://blogs.catapultsystems.com/chsimmons/archive/2018/01/30/parse-envpath-with-powershell

Другие вопросы по теме