是否有人知道如何确定文件的位置,该文件位于PATH环境变量指定的文件夹之一,而不是从根文件夹中执行dir filename.exe / s?
我知道这扩展了编程问题的范围,但这对于与部署相关的问题很有用,我还需要检查可执行文件的依赖关系。 : - )
答案 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* } }