Расположение файла по пути - PullRequest
       11

Расположение файла по пути

11 голосов
/ 12 октября 2008

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

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

Ответы [ 7 ]

37 голосов
/ 12 октября 2008

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

4 голосов
/ 13 октября 2008

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

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

Замените file на имя файла, который вы ищете.

3 голосов
/ 13 октября 2008

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

1 голос
/ 31 января 2018

Использование 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 Chad@ChadsTech.net - 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

1 голос
/ 12 октября 2008

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

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

Этот фрагмент 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;
}
?>

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

0 голосов
/ 12 октября 2008

В дополнение к утилитам 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'.

0 голосов
/ 12 октября 2008

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

 function PSwhere($file) { $env:Path.Split(";") | ? { test-path $_\$file* } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...