2008-10-12 13 views
7

Est-ce que quelqu'un sait comment déterminer l'emplacement d'un fichier se trouvant dans l'un des dossiers spécifiés par la variable d'environnement PATH autre que de faire un répertoire filename.exe/s à partir du dossier racine? Je sais que cela étire les limites d'une question de programmation, mais cela est utile pour les problèmes de déploiement, aussi j'ai besoin d'examiner les dépendances d'un exécutable. :-)Localisation d'un fichier sur le chemin

Répondre

31

Vous pouvez utiliser l'utilitaire where.exe dans le répertoire C:\Windows\System32.

+0

Merci - court mais doux, je savais qu'il y avait un outil simple ligne de commande pour elle ...! – ljs

+0

Pour quel système d'exploitation? Je ne peux pas trouver "where.exe" n'importe où sur mon système Windows XP. –

+1

WHERE.EXE est livré avec Windows XP Server 2003 et versions ultérieures ainsi que les kits de ressources Windows depuis Win2K. Il est également inclus avec VS2005, mais pas 2008 (C: \ Program Files \ Microsoft Visual Studio 8 \ Common7 \ Outils \ Bin \ Where.Exe). – raven

1

Sur les fenêtres, je dirais que l'utilisation %WINDIR%\system32\where.exe

titre Votre question ne précise pas les fenêtres, donc j'imagine que certaines personnes pourraient trouver cette question à la recherche de la même chose avec un système d'exploitation POSIX sur leur esprit (comme moi).

Cet extrait de php peut les aider:

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

C'est le code de production légèrement modifié je cours sur plusieurs serveurs. (Par exemple hors contexte OO et a laissé quelques assainissement et la vérification des erreurs pour la brièveté.)

+0

L'étiquette a déclaré windows. – jop

+0

Je sais maintenant, mais je n'ai pas vu le tag avant que j'ai posté – Kris

+0

c'est encore utile, merci! J'utilise unix à l'occasion. – ljs

-1

juste pour le plaisir, voici un powershell one-liner mise en œuvre

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

Cela ne marche pas, puisque les chemins dans 'PATH' peuvent aussi contenir'; '(et sont alors cités). – Joey

+0

Je ne m'en suis pas rendu compte. Bon point –

0

En plus du « qui » (MS Windows) et 'where' (unix/linux), j'ai écrit mon propre utilitaire que j'appelle 'findinpath'. En plus de trouver l'exécutable qui serait exécuté, s'il est transmis à l'interpréteur de ligne de commande (CLI), il trouvera toutes les correspondances, renvoyé path-search-order afin que vous puissiez trouver des problèmes d'ordre de chemin. De plus, mon utilitaire renvoie non seulement des exécutables, mais n'importe quelle correspondance de spécification de fichier, pour capturer ces moments où un fichier désiré n'est pas réellement exécutable. J'ai également ajouté une fonctionnalité qui s'est avérée très utile; l'indicateur -s lui indique de rechercher non seulement le chemin du système, mais tout sur le disque système, répertoires utilisateur connus exclus. J'ai trouvé que cette fonction soit incroyablement utile dans les tâches d'administration des systèmes ...

est ici la sortie « usage »:

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 

L'écriture d'un tel utilitaire est pas difficile et je vais le laisser comme un exercice pour le lecteur. Ou, si demandé ici, je posterai mon script - c'est dans 'bash'.

2

Si vous souhaitez rechercher le fichier au niveau de l'API, vous pouvez utiliser PathFindOnPath. Il a l'avantage supplémentaire de pouvoir spécifier des répertoires supplémentaires, au cas où vous voudriez rechercher dans des emplacements supplémentaires en dehors du système ou du chemin utilisateur actuel.

4

Pour les systèmes Windows NT:

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

Remplacer file avec le nom du fichier que vous recherchez.

+0

+1 l'un des rares endroits où les moteurs de recherche ont trouvé une solution qui fonctionne sans aucun outil tiers. Merci! –

+0

vous pouvez remplacer $ PATH par n'importe quel $ environmentVariable et également rechercher des fichiers non-binaires. Juste ce dont j'avais besoin! –

+1

Utilisez 'pour% e dans (% PATHEXT%) do @ (pour% x dans (fichier% e) faites @if pas"% ~ $ PATH: x "==" "@ echo.% ~ $ CHEMIN: x) 'si vous ne connaissez pas l'extension. – Joey

1

Utilisation de PowerShell sous 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]" } } 

J'ai aussi blogué la réponse avec quelques détails sur au http://blogs.catapultsystems.com/chsimmons/archive/2018/01/30/parse-envpath-with-powershell

Questions connexes