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





Вы можете использовать утилиту where.exe в каталоге C:\Windows\System32.
Для какой ОС? Я не могу найти "where.exe" в своей системе Windows XP.
WHERE.EXE поставляется с Windows XP Server 2003 и выше, а также с наборами ресурсов Windows начиная с Windows 2000. Он также включен в VS2005, но не в 2008 (C: \ Program Files \ Microsoft Visual Studio 8 \ Common7 \ Tools \ Bin \ Where.Exe).
В 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;
}
?>
Это немного измененный производственный код, который я запускаю на нескольких серверах. (т.е. вырвано из объектно-ориентированного контекста и оставлено для краткости некоторая очистка и проверка ошибок.)
Теперь я знаю, но не видел тега до того, как опубликовал
это все еще полезно, спасибо! Иногда я использую unix.
просто для удовольствия, вот однострочная реализация powershell
function PSwhere($file) { $env:Path.Split(";") | ? { test-path $_$file* } }
Это не работает, поскольку пути в PATH могут также содержать ; (и тогда они цитируются).
В дополнение к утилитам 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 одно из немногих мест, где поисковые системы предложили решение, которое работает без сторонних инструментов. Благодарность!
вы можете заменить $ PATH любой переменной $ environmentVariable, а также искать небинарные файлы. Как раз то, что мне было нужно!
Используйте for %e in (%PATHEXT%) do @(for %x in (file%e) do @if not "%~$PATH:x"= = "" @echo.%~$PATH:x), если вы не знаете расширение.
Использование 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
Спасибо - коротко, но мило, я знал, что для этого есть простой инструмент командной строки ...!