2008-10-12 22 views
7

¿Alguien sabe cómo determinar la ubicación de un archivo que está en una de las carpetas especificadas por la variable de entorno PATH aparte de hacer un dir filename/de la carpeta raíz?Localización de un archivo en la ruta

Sé que esto está estirando los límites de una pregunta de programación, pero esto es útil para problemas relacionados con la implementación, también tengo que examinar las dependencias de un ejecutable. :-)

Respuesta

31

Puede utilizar la utilidad where.exe en el directorio C:\Windows\System32.

+0

Gracias - corta pero dulce, sabía que era una herramienta de línea de comandos sencilla para ella ...! – ljs

+0

¿Para qué sistema operativo? No puedo encontrar "where.exe" en ninguna parte de mi sistema Windows XP. –

+1

WHERE.EXE se envía con Windows XP Server 2003 y posterior, así como los kits de recursos de Windows desde Win2K. También se incluye con VS2005, pero no 2008 (C: \ Archivos de programa \ Microsoft Visual Studio 8 \ Common7 \ Tools \ Bin \ Where.Exe). – raven

1

En las ventanas que diría uso %WINDIR%\system32\where.exe

Sus preguntas título no especifica las ventanas así que me imagino que algunas personas podrían encontrar esta pregunta en busca de la misma con un sistema operativo POSIX en su mente (como yo).

Este fragmento de código php podría ayudarles a:

<?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; 
} 
?> 

Este código de producción es ligeramente alterada estoy corriendo en varios servidores. (Es decir, fuera de contexto OO y dejó algunas saneamiento y comprobación de errores a cabo por razones de brevedad.)

+0

La etiqueta indica ventanas. – jop

+0

Lo sé ahora, pero no vi la etiqueta antes de publicar – Kris

+0

. Sin embargo, esto sigue siendo útil, ¡gracias! Utilizo Unix en ocasiones. – ljs

-1

sólo por diversión, aquí es una aplicación powershell de una sola línea

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

Eso no funciona, ya que las rutas en 'PATH' pueden contener'; 'también (y luego se citan). – Joey

+0

No me di cuenta de eso. Buen punto –

0

Además de la 'que' (MS Windows) y 'donde' (unix/linux) utilidades, he escrito mi propia utilidad que llamo 'findinpath'. Además de encontrar el ejecutable que se ejecutará, si se entrega al intérprete de línea de comandos (CLI), encontrará todas las coincidencias, el orden de búsqueda de ruta devuelto para que pueda encontrar problemas de orden de ruta. Además, mi utilidad devuelve no solo ejecutables, sino cualquier coincidencia de especificación de archivos, para capturar esos momentos cuando un archivo deseado no es realmente ejecutable.

También agregué una función que resultó ser muy ingeniosa; el indicador -s le dice que busque no solo la ruta del sistema, sino todo en el disco del sistema, excluidos los directorios de usuario conocidos. He encontrado esta característica para ser increíblemente útil en tareas de administración de sistemas ...

Aquí está la salida 'uso':

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 

Escribir una utilidad no es difícil y lo dejo como ejercicio para el lector O, si se le pregunta aquí, publicaré mi script, está en 'bash'.

2

Si desea ubicar el archivo en el nivel de API, puede usar PathFindOnPath. Tiene la ventaja adicional de poder especificar directorios adicionales, en caso de que desee buscar en ubicaciones adicionales aparte del sistema o la ruta del usuario actual.

4

Para sistemas basados ​​en Windows NT:

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

Reemplazar file con el nombre del archivo que está buscando.

+0

+1 uno de los pocos lugares en los que los buscadores encontraron una solución que funciona sin herramientas de terceros. ¡Gracias! –

+0

puede reemplazar $ PATH con cualquier $ environmentVariable, y también buscar archivos no binarios. ¡Justo lo que necesitaba! –

+1

Utilice 'para% e en (% PATHEXT%) do @ (para% x en (archivo% e) do @if no"% ~ $ RUTA: x "==" "@ echo.% ~ $ RUTA: x) 'si no sabes la extensión. – Joey

1

Uso de PowerShell en 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]" } } 

También escribió en su blog la respuesta con algunos detalles más en http://blogs.catapultsystems.com/chsimmons/archive/2018/01/30/parse-envpath-with-powershell

Cuestiones relacionadas