如何遍历含可变部分的文件夹路径?含Blender路径通配符改写示例
刚好我经常处理这类路径匹配和遍历的需求,给你拆解成几个核心点来解决:
一、先搞定环境变量的解析
像%USERNAME%这种是Windows系统的环境变量,不管是遍历还是路径匹配,第一步要么把它解析成实际路径,要么让工具直接识别变量名处理,分常用工具给你方案:
1. Windows Batch 脚本
Batch会自动解析路径里的%xxx%格式变量,直接用通配符*匹配可变文件夹就行:
rem 遍历所有blender开头的文件夹,执行里面的blender -R for /d %%i in ("C:\Users\%USERNAME%\OneDrive\Applications\blender*") do ( echo 找到匹配的文件夹:%%i "%%i\blender" -R )
如果是处理%known_path%\folder-[%CHANGEABLE_PART%]\there.exe这种格式,直接把[%CHANGEABLE_PART%]换成*,Batch同样能识别:
for /d %%i in ("%known_path%\folder-*") do ( "%%i\there.exe" )
2. PowerShell
PowerShell里用$env:变量名调用环境变量,通配符支持更灵活:
# 解析USERNAME变量,遍历blender开头的文件夹 $targetPaths = Get-ChildItem -Path "C:\Users\$env:USERNAME\OneDrive\Applications\blender*" -Directory foreach ($folder in $targetPaths) { Write-Host "找到目标文件夹:$($folder.FullName)" # 执行blender -R命令 & "$($folder.FullName)\blender" -R }
要是你手里是带占位符的字符串(比如%USERNAME%\Apps\blender-[%VERSION%]\blender),可以先解析环境变量再替换占位符:
$originalStr = "%USERNAME%\OneDrive\Applications\blender-[%VERSION%]\blender -R" # 先替换已知环境变量 $parsedStr = [Environment]::ExpandEnvironmentVariables($originalStr) # 把可变占位符换成通配符 $wildcardStr = $parsedStr -replace '\[%VERSION%\]', '*'
3. Python(跨平台通用)
用os.path.expandvars()解析环境变量,glob模块处理通配符遍历:
import os import glob import subprocess # 解析环境变量并生成带通配符的路径 base_path = os.path.expandvars(r"C:\Users\%USERNAME%\OneDrive\Applications\blender*") # 遍历所有匹配的文件夹 for folder in glob.glob(base_path): if os.path.isdir(folder): print(f"找到匹配文件夹:{folder}") blender_exe = os.path.join(folder, "blender") # 执行blender -R命令 subprocess.run([blender_exe, "-R"], check=True)
二、路径格式转换技巧
比如你举的例子:C:\Users\%USERNAME%\OneDrive\Applications\blender-2.78.0-git.1bd6ed7-windows64\blender -R 转成 C:\Users\%USERNAME%\OneDrive\Applications\blender*\blender -R
核心是识别可变部分的规律,把固定前缀/后缀之间的可变内容替换成*:
- 如果是版本号这类有固定前缀(比如
blender-)和后缀(比如-windows64)的,直接把中间的版本字符串换成* - 如果是
folder-[%CHANGEABLE_PART%]这种明确的占位符格式,直接替换[%CHANGEABLE_PART%]为*就行
举个Batch里的字符串替换示例:
set "originalPath=C:\Users\%USERNAME%\OneDrive\Applications\blender-2.78.0-git.1bd6ed7-windows64\blender -R" rem 把版本段替换成通配符 set "wildcardPath=%originalPath:blender-*-windows64=blender*%" echo 转换后的路径:%wildcardPath%
三、遍历的注意事项
- 通配符
*默认不匹配路径分隔符\,如果要遍历子文件夹里的内容,PowerShell和Python可以用**(比如blender**\blender.exe),Batch需要额外嵌套循环处理 - 确保你有目标文件夹的访问权限,否则遍历会抛出权限错误
- 如果有多个匹配的文件夹,可根据需求筛选(比如按创建时间排序取最新的一个)
内容的提问来源于stack exchange,提问作者Yu Da Chi
相关产品推荐
相关产品推荐

