PowerShell如何跨多个子文件夹使用Get-Content递归读取文件
问题原因
运行脚本触发PermissionDenied错误、无法遍历子文件夹的核心原因有3个:
- 直接为
Get-Content传入C:\Temp\*路径时,通配符会同时匹配根目录下的文件和子文件夹对象,Get-Content仅支持读取文件内容,尝试读取文件夹时就会抛出权限拒绝错误 - 原命令未添加递归参数,默认仅处理C:\Temp根目录下的对象,不会自动进入下层子文件夹扫描
- 原脚本存在逻辑缺陷:未做全量结果收集只会保留最后一个匹配项、未做字符串长度判断会在匹配文本后不足6字符时触发截取报错、输出文件存放在扫描目录下可能出现读取自身生成文件的无效匹配问题。
修正后的可运行脚本
# 定义匹配规则,匹配目标字符串后跟随的内容 [regex] $pattern = '(?<=a piece of text)(?<chunk>.*)' # 定义根扫描路径和输出文件路径 $rootPath = 'C:\Temp' $outputPath = 'C:\Temp\results.txt' # 初始化结果存储数组 $allResults = @() # 递归遍历根路径下所有文件,跳过文件夹本身、输出文件自身、无权限访问的项 Get-ChildItem -Path $rootPath -File -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.FullName -ne $outputPath } | ForEach-Object { $currentFile = $_.FullName # 逐行读取当前文件内容 Get-Content -Path $currentFile -ErrorAction SilentlyContinue | ForEach-Object { if ($_ -match $pattern) { $chunkContent = $matches.chunk # 截取前6个字符,长度不足时直接取全部现有内容 $smallchunk = if ($chunkContent.Length -ge 6) { $chunkContent.Substring(0,6) } else { $chunkContent } # 把匹配结果加入结果集,附带来源文件路径方便排查 $allResults += "匹配来源文件:$currentFile`n匹配截取结果:$smallchunk`n---" } } } # 所有匹配结果写入输出文件 $allResults | Out-File -Path $outputPath -Encoding utf8
关键参数说明
-File:限定Get-ChildItem只返回文件对象,直接跳过所有子文件夹,从根源避免读取文件夹触发的权限错误-Recurse:强制遍历所有层级的子文件夹,覆盖folder1、folder2、folder3等所有下层目录里的文件-ErrorAction SilentlyContinue:自动跳过确实无权限访问的受系统保护文件,不会中断整体扫描流程- 额外添加了输出文件排除逻辑,避免脚本扫描到自己生成的results.txt产生无效匹配
- 增加了字符串长度判断,当目标字符串出现在行尾、后面不足6个字符时不会抛出截取异常
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

