我想在子目录中找到给定文件的所有位置,该子目录中可以包含通配符。
在un * x上,我将使用类似以下内容:
find ba* -type f -name "foo" -exec dirname {}
不幸的是,我需要在Windows上使用BAT或PowerShell来执行此操作(我并不在乎,但是我对W32中的脚本的了解很少是关于BAT的)。
到目前为止,我已经提出了
FOR /R bar %f IN (foo*) DO @echo %~pf
但这不允许在目录参数中使用通配符,例如
FOR /R ba* %f IN (foo*) DO @echo %~pf
无效。所以我尝试了嵌套循环:
FOR /D %d IN (ba*) DO FOR /R bar %f %d IN (foo*) DO @echo %~pf
但这只是给我一个错误,%f在此位置不能被语法使用(德语:“%f” kann syntaktisch nicht and dyers Stelle verwendet werden)。
背景
我要解决的实际问题是:
在AppVeyor中,MinGW装置被埋在诸如
C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1
之类的一些神秘目录中。我想到没有逐字指定这些 secret 路径(就升级传送者图像而言,它们很可能是脆弱的),我想到的是仅在我的CI配置中指定诸如
*x86_64-6.3.*
之类的内容,然后让CI脚本搜索所需路径二进制文件(例如mingw64-make.exe
)并将其自动添加到我的PATH
中。在多次匹配的情况下,我想我只会使用找到的路径中的任何一个(例如第一个或最后一个)。
例如就像是:
bash$ MINGW_DIR=$(find /c/mingw-w64/${pattern} -type f -name "mingw64-make.exe" -exec dirname {} | tail -1)
响应:
cmd> FOR /D %d IN (%pattern%) DO FOR /R bar %f %d IN (mingw64-make.*) DO @set %MINGW_DIR%=%~pf
最佳答案
如何在子目录中找到文件并将该子目录添加到当前 session 的路径(PowerShell)的示例:
$executablePath = Get-ChildItem -Filter mingw64-make.exe -File -Recurse |
Select-Object -ExpandProperty DirectoryName
if ( $executablePath ) {
if ( $env:Path[$env:Path.Length - 1] -ne ";" ) {
$env:Path += ";"
}
$env:Path += $executablePath
}
关于powershell - 如何使用通配符在子目录中查找文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48671600/