使用PowerShell对比单个TXT文件与文件夹内多个TXT文件
PowerShell脚本:对比基准权限文件与多个应用文件的匹配项
我看你已经着手写PowerShell脚本来对比权限文件和应用文件的匹配项了,不过有几个关键地方需要调整和补全,我帮你把脚本完善好,刚好能贴合你的需求:
先明确你的需求:
- 基准文件
permfile.txt:内容是空格分隔的权限项(比如x1 x2 x3 … x250) - 目标目录
AppFiles下的多个TXT文件:内容格式为uses 'x1' uses 'x5' … - 需要找出每个应用文件中,和基准文件匹配的权限项
完整优化后的脚本
# 1. 读取基准权限文件,拆分成干净的权限数组 # 假设permfile是一行空格分隔的项,如果是每行一个项,注释掉下面这行,启用下一行 $permissions = (Get-Content "C:\Users\user1\Documents\permfile.txt" -Raw).Trim() -split '\s+' | Where-Object { $_ } # $permissions = Get-Content "C:\Users\user1\Documents\permfile.txt" | Where-Object { $_ } # 每行一个权限项时用这个 # 2. 获取目标目录下的所有TXT文件(这里要注意用Get-ChildItem,不是Get-Content) $appFiles = Get-ChildItem -Path "C:\Users\user1\Documents\AppFiles\" -Filter "*.txt" # 3. 遍历每个应用文件,逐一对比 foreach ($file in $appFiles) { Write-Host "`n=== 正在处理文件: $($file.Name) ===" -ForegroundColor Cyan # 4. 读取文件内容,提取所有单引号内的权限项 $fileContent = Get-Content $file.FullName -Raw # 用正则表达式匹配'xxx'格式的内容,提取出中间的权限项 $usedPermissions = [regex]::Matches($fileContent, "'([^']+)'") | ForEach-Object { $_.Groups[1].Value } # 5. 对比基准权限列表,筛选出匹配项 $matchedPermissions = $usedPermissions | Where-Object { $permissions -contains $_ } # 6. 输出结果(也可以改成写入文件) if ($matchedPermissions.Count -gt 0) { Write-Host "匹配到的权限项:" -ForegroundColor Green $matchedPermissions | ForEach-Object { Write-Host "- $_" } # 可选:把结果写入文件 # $matchedPermissions | Out-File "C:\Users\user1\Documents\MatchResults_$($file.Name)" -Encoding utf8 } else { Write-Host "未匹配到任何权限项" -ForegroundColor Yellow } }
关键细节说明
- 读取基准文件的两种方式:脚本里提供了两种读取逻辑,根据你的
permfile.txt实际格式选择:- 如果是一行空格分隔所有权限,用第一行的
-Raw读取+拆分逻辑 - 如果是每行一个权限项,启用注释的第二行
- 如果是一行空格分隔所有权限,用第一行的
- 获取目标文件:你之前用
Get-Content读取目录是错误的,必须用Get-ChildItem来获取目录下的文件列表 - 提取应用文件中的权限项:用正则表达式
'([^']+)'精准匹配单引号内的内容,避免把uses这类无关字符也提取出来 - 匹配逻辑:用
-contains判断权限项是否在基准列表中,简单高效
可选扩展
如果需要把所有结果汇总到一个文件里,可以在循环结束后添加:
# 汇总所有匹配结果到一个文件 $allMatches = @() foreach ($file in $appFiles) { # 重复上面的提取和匹配逻辑,把结果添加到$allMatches $fileContent = Get-Content $file.FullName -Raw $usedPermissions = [regex]::Matches($fileContent, "'([^']+)'") | ForEach-Object { $_.Groups[1].Value } $matchedPermissions = $usedPermissions | Where-Object { $permissions -contains $_ } if ($matchedPermissions) { $allMatches += "=== $($file.Name) ===" $allMatches += $matchedPermissions } } $allMatches | Out-File "C:\Users\user1\Documents\All_Match_Results.txt" -Encoding utf8
内容的提问来源于stack exchange,提问作者user9529969
相关产品推荐
相关产品推荐

