我想在子目录中找到给定文件的所有位置,子目录中可以包含通配符。
在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 an dieser Stelle verwendet werden )。
我想解决的实际问题是:
在AppVeyor中,MinGW安装被隐藏在一些神秘的目录中,如C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1
。
而不是逐字地指定这些神秘的路径(最有可能是关于appveyor图像升级的脆弱路径),我想只在我的CI配置中指定类似*x86_64-6.3.*
的东西,然后让CI脚本搜索所需二进制文件的路径(例如mingw64-make.exe
)并自动将其添加到我的PATH
。
在多次匹配的情况下,我想我只是使用找到的路径中的任何一个(例如,第一个或最后一个)。
e.g。类似的东西:
bash$ MINGW_DIR=$(find /c/mingw-w64/${pattern} -type f -name "mingw64-make.exe" -exec dirname {} | tail -1)
RESP:
cmd> FOR /D %d IN (%pattern%) DO FOR /R bar %f %d IN (mingw64-make.*) DO @set %MINGW_DIR%=%~pf
答案 0 :(得分:3)
如何在子目录中定位文件并将该子目录添加到当前会话的路径(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
}
答案 1 :(得分:0)
使用Batch可以执行此操作的方法是使用findstr命令。
批处理文件中的示例:
@echo
findstr /i /s /C:"random" *.*
pause
/i
使搜索不区分大小写
/s
表示在子目录中搜索
C/:
表示搜索此特定字符串
输出格式为:
path
{::: {1}}
您也可以将the text containing the string [which may be the whole file]
和dir
合并为:
findstr
以上将递归遍历您的根目录并打印出每个文件的位置[点击空间继续作为暂停执行它在锡上所说的内容]
您可以将for /f "delims=." %%a in ('dir /B /A-D ^| findstr /i /s /C:"random" *.bat') do (
echo "%%a"
pause
)
替换为echo %%a
,将SET PATH=%PATH%;%%a
中找到的路径添加到环境路径
findstr
将使用扩展期作为打印/匹配的剪切。没有它你会得到部分文件名。
"delims=."
表示它将以裸格式打印当前目录,但不打印文件夹。
[这些示例是为批处理文件设计的]
希望它有所帮助!