19 Stimmen

Auffinden einer Datei im Pfad

Weiß jemand, wie man den Speicherort einer Datei bestimmen kann, die sich in einem der durch die Umgebungsvariable PATH angegebenen Ordner befindet, ohne ein dir filename.exe /s aus dem Root-Ordner auszuführen?

Ich weiß, dass dies den Rahmen einer Programmierfrage sprengt, aber dies ist nützlich für Fragen im Zusammenhang mit der Bereitstellung, außerdem muss ich die Abhängigkeiten einer ausführbaren Datei untersuchen :-)

51voto

MvdD Punkte 19735

Sie können die where.exe Nutzen in der C:\Windows\System32 Verzeichnis.

0 Stimmen

Danke - kurz aber gut, ich wusste, dass es ein einfaches Kommandozeilentool dafür gibt...!

0 Stimmen

Für welches Betriebssystem? Ich kann die Datei "where.exe" nirgendwo auf meinem Windows XP-System finden.

1 Stimmen

WHERE.EXE wird mit Windows XP Server 2003 und höher sowie mit den Windows Resource Kits seit Win2K ausgeliefert. Es ist auch in VS2005 enthalten, aber nicht in 2008 ( C:\Program Dateien \Microsoft Visual Studio 8 \Common7\Tools\Bin\Where.Exe ).

6voto

Patrick Cuff Punkte 27220

Für WindowsNT-basierte Systeme:

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

Ersetzen Sie file mit dem Namen der Datei, die Sie suchen.

0 Stimmen

+1 einer der wenigen Orte, an denen die Suchmaschinen eine Lösung gefunden haben, die ohne Drittanbieter-Tools funktioniert.

0 Stimmen

Können Sie $PATH durch eine beliebige $environmentVariable ersetzen und auch nach nicht-binären Dateien suchen. Genau das, was ich brauchte!

1 Stimmen

Verwenden Sie for %e in (%PATHEXT%) do @(for %x in (file%e) do @if not "%~$PATH:x"=="" @echo.%~$PATH:x) wenn Sie die Durchwahl nicht kennen.

3voto

Nick Punkte 6782

Wenn Sie die Datei auf der API-Ebene suchen wollen, können Sie PfadFindenAufPfad . Sie hat den zusätzlichen Vorteil, dass Sie zusätzliche Verzeichnisse angeben können, falls Sie neben dem Systempfad oder dem Pfad des aktuellen Benutzers weitere Orte durchsuchen möchten.

1voto

Kris Punkte 38235

Unter Windows würde ich sagen, verwenden Sie %WINDIR%\system32\where.exe

Der Titel Ihrer Frage spezifiziert nicht Windows, so dass ich mir vorstellen kann, dass einige Leute diese Frage finden könnten, die nach demselben suchen, aber ein Posix-Betriebssystem im Kopf haben (wie ich).

Dieses php-Snippet könnte ihnen helfen:

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

Dies ist ein leicht abgewandelter Produktionscode, der auf mehreren Servern läuft. (d.h. aus dem OO-Kontext herausgenommen und der Kürze halber einige Bereinigungen und Fehlerüberprüfungen weggelassen).

0 Stimmen

Jetzt weiß ich es, aber ich habe die Markierung nicht gesehen, bevor ich gepostet habe.

0 Stimmen

Das ist aber trotzdem nützlich, danke! Ich verwende Unix gelegentlich.

1voto

ChadsTech Punkte 11

Verwendung von PowerShell unter 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]" } } 

Ich habe die Antwort mit einigen Details auch in einem Blog veröffentlicht unter http://blogs.catapultsystems.com/chsimmons/archive/2018/01/30/parse-envpath-with-powershell

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X