2008-10-12 2 views
7

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

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

ответ

31

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

+0

Спасибо - короткий, но сладкий, я знал, что есть простой инструмент командной строки для него ...! – ljs 2008-10-12 15:20:00

+0

Для какой ОС? Я не могу найти «where.exe» где-нибудь в моей системе Windows XP. – 2008-10-13 12:18:26

+1

WHERE.EXE поставляется с Windows XP Server 2003 и выше, а также комплекты ресурсов Windows с момента запуска Win2K. Он также включен в VS2005, но не в 2008 году (C: \ Program Files \ Microsoft Visual Studio 8 \ Common7 \ Tools \ Bin \ Where.Exe). – raven 2008-10-13 18:42:12

1

На окнах я бы сказал, что использование %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; 
} 
?> 

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

+0

В теге указаны окна. – jop 2008-10-12 15:43:58

-1

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

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

В дополнение к «который» (MS Windows) и «где» (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».

2

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

4

Для систем WindowsNT на основе:

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

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

1

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

Смежные вопросы