如何用PowerShell根据部分文件名查找对应PDF文件?
解决PowerShell查找对应PDF文件的问题
原脚本的核心问题是通过路径替换生成带通配符的字符串,既无法直接获取实际文件路径,还容易因构造逻辑导致匹配错误。下面是修正后的方案,直接定位目录搜索并筛选匹配的PDF文件:
修正后的脚本
$fileExtensions = @("*.ipt", "*.iam", "*.ipn", "*.idw") Get-ChildItem -Path $PathEngDesign -File -Include $fileExtensions -Recurse -ErrorAction SilentlyContinue -Force | ForEach-Object { $sourceFile = $_ Write-Host "源文件路径: $($sourceFile.FullName)" # 获取源文件所在目录 $targetDir = $sourceFile.Directory.FullName # 获取源文件的基础名称(不含扩展名) $baseName = $sourceFile.BaseName # 在当前目录下查找所有PDF文件,筛选文件名包含源文件基础名的项 $matchingPdfs = Get-ChildItem -Path $targetDir -Filter "*.pdf" -File | Where-Object { $_.Name -match [regex]::Escape($baseName) } if ($matchingPdfs) { Write-Host "找到对应的PDF文件:" $matchingPdfs | ForEach-Object { Write-Host " $($_.FullName)" } } else { Write-Host "未找到对应PDF文件" } }
关键改动说明
- 直接定位搜索目录:不再构造带通配符的路径,而是直接在源文件的同目录下搜索PDF,避免路径拼接错误
- 安全的正则匹配:用
[regex]::Escape($baseName)转义基础名中的特殊字符(如点号、连字符),确保匹配逻辑准确,不会把文件名里的特殊符号当成正则语法解析 - 获取真实文件路径:通过
Get-ChildItem直接拿到匹配的文件对象,能输出实际存在的完整路径,而不是仅判断存在性
可选优化
如果需要更严格的匹配规则(比如要求源文件基础名是PDF文件名的独立部分,而非子字符串),可以把匹配逻辑调整为:
# 匹配基础名前后是边界(非字母数字)或字符串首尾,避免类似TAX457匹配TAX4578.pdf的情况 $_.Name -match "(^|\W)$([regex]::Escape($baseName))(\W|$)"
内容的提问来源于stack exchange,提问作者ITBrute
相关产品推荐
相关产品推荐

