在路径上查找文件

时间:2008-10-12 15:12:51

标签: windows

是否有人知道如何确定文件的位置,该文​​件位于PATH环境变量指定的文件夹之一,而不是从根文件夹中执行dir filename.exe / s?

我知道这扩展了编程问题的范围,但这对于与部署相关的问题很有用,我还需要检查可执行文件的依赖关系。 : - )

7 个答案:

答案 0 :(得分:37)

您可以使用where.exe目录中的C:\Windows\System32实用程序。

答案 1 :(得分:4)

对于基于WindowsNT的系统:

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

file替换为您要查找的文件的名称。

答案 2 :(得分:3)

如果要在API级别找到该文件,可以使用PathFindOnPath。如果您想要在除系统或当前用户路径之外的其他位置进行搜索,还可以指定其他目录。

答案 3 :(得分:1)

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

这是我在几台服务器上运行的略有改动的生产代码。 (即从OO环境中取出并留下一些卫生设施和错误检查以便简洁。)

答案 4 :(得分:1)

在Windows上使用PowerShell ...

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]" } } 

我还在http://blogs.catapultsystems.com/chsimmons/archive/2018/01/30/parse-envpath-with-powershell

上写了一些有关详细信息的答案

答案 5 :(得分:0)

除了'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'。

答案 6 :(得分:-1)

只是为了踢,这是一个单线程的PowerShell实现

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