PowerShell脚本开发求助:检查多级文件夹结构及指定文件是否存在
PowerShell目录结构校验脚本实现指南
嘿,作为PowerShell新手,你这个目录结构校验的需求其实很常见,我来一步步帮你搭建这个脚本,还会把关键逻辑讲清楚,方便你以后修改调整!
整体思路
咱们的脚本要分四层校验:
- 第一层:确认根文件夹
2017是否存在 - 第二层:校验根目录下是否正好有12个以
Jan到Dec命名的子文件夹 - 第三层:对每个月份文件夹,校验它下面的天数子文件夹数量是否符合2017年(平年)的对应月份天数
- 第四层:对每个天数文件夹,检查里面是否包含你指定的10个文件
完整脚本示例
# 定义根文件夹路径,你可以根据实际情况修改 $rootFolder = ".\2017" # 定义需要检查的10个文件名,这里假设是file1到file10,你替换成自己的文件名即可 $requiredFiles = @("file1.txt", "file2.txt", "file3.txt", "file4.txt", "file5.txt", "file6.txt", "file7.txt", "file8.txt", "file9.txt", "file10.txt") # 定义2017年(平年)每个月份对应的天数,键是月份名称,值是天数 $monthDayMap = @{ "Jan" = 31 "Feb" = 28 "Mar" = 31 "Apr" = 30 "May" = 31 "Jun" = 30 "Jul" = 31 "Aug" = 31 "Sep" = 30 "Oct" = 31 "Nov" = 30 "Dec" = 31 } # 第一步:检查根文件夹是否存在 if (-not (Test-Path -Path $rootFolder -PathType Container)) { Write-Error "错误:根文件夹 '$rootFolder' 不存在!" exit 1 } # 第二步:检查根目录下的月份文件夹是否符合要求 $monthFolders = Get-ChildItem -Path $rootFolder -Directory | Select-Object -ExpandProperty Name $expectedMonths = $monthDayMap.Keys | Sort-Object # 先检查数量是否为12 if ($monthFolders.Count -ne 12) { Write-Error "错误:根文件夹下的月份子文件夹数量不符合要求,预期12个,实际找到 $($monthFolders.Count) 个!" exit 1 } # 再检查每个月份名称是否都在预期列表里 foreach ($month in $monthFolders) { if ($expectedMonths -notcontains $month) { Write-Error "错误:发现未知的月份文件夹 '$month',预期应为 $($expectedMonths -join ', ')!" exit 1 } } # 第三步:遍历每个月份文件夹,检查天数子文件夹 foreach ($month in $expectedMonths) { $monthPath = Join-Path -Path $rootFolder -ChildPath $month $dayFolders = Get-ChildItem -Path $monthPath -Directory | Select-Object -ExpandProperty Name $expectedDayCount = $monthDayMap[$month] # 检查天数文件夹数量是否正确 if ($dayFolders.Count -ne $expectedDayCount) { Write-Error "错误:月份文件夹 '$month' 下的天数子文件夹数量不符合要求,预期 $expectedDayCount 个,实际找到 $($dayFolders.Count) 个!" continue # 这里用continue而不是exit,让脚本继续检查其他月份,你也可以改成exit直接终止 } # 额外校验:天数文件夹的名称是否是数字(比如1,2,...31) foreach ($dayFolder in $dayFolders) { if (-not ($dayFolder -match '^\d+$') -or [int]$dayFolder -lt 1 -or [int]$dayFolder -gt $expectedDayCount) { Write-Warning "警告:月份 '$month' 下的天数文件夹 '$dayFolder' 名称不符合要求(应为1到$expectedDayCount的数字)!" } } # 第四步:遍历每个天数文件夹,检查指定文件是否存在 foreach ($day in 1..$expectedDayCount) { $dayPath = Join-Path -Path $monthPath -ChildPath $day.ToString() if (-not (Test-Path -Path $dayPath -PathType Container)) { Write-Error "错误:月份 '$month' 下缺少天数文件夹 '$day'!" continue } $missingFiles = @() foreach ($file in $requiredFiles) { $filePath = Join-Path -Path $dayPath -ChildPath $file if (-not (Test-Path -Path $filePath -PathType Leaf)) { $missingFiles += $file } } if ($missingFiles.Count -gt 0) { Write-Error "错误:天数文件夹 '$dayPath' 下缺少以下文件:$($missingFiles -join ', ')!" } else { Write-Host "成功:天数文件夹 '$dayPath' 下的所有指定文件均存在!" -ForegroundColor Green } } } Write-Host "所有校验完成!" -ForegroundColor Cyan
脚本关键部分解释
变量定义:
$rootFolder:指定你的根文件夹路径,记得改成你实际的路径(比如C:\Data\2017)$requiredFiles:这里列出了你需要检查的10个文件名,直接替换成你实际需要的文件名即可$monthDayMap:因为2017是平年,所以Feb是28天,这个哈希表用来存储每个月份对应的天数,方便后续校验
根文件夹校验:用
Test-Path检查文件夹是否存在,不存在就直接报错退出月份文件夹校验:
- 先获取根目录下的所有子文件夹名称,然后和预期的12个月份对比
- 既检查数量是否为12,又检查每个名称是否都是合法的月份名
天数文件夹校验:
- 对每个月份,先获取它下面的天数文件夹,对比数量是否符合
$monthDayMap里的天数 - 额外加了一个校验:天数文件夹的名称是否是合法的数字(比如不能出现
0或者32这样的无效天数)
- 对每个月份,先获取它下面的天数文件夹,对比数量是否符合
文件存在性校验:
- 遍历每个天数文件夹,逐个检查
$requiredFiles里的文件是否存在 - 如果有缺失,就输出错误信息;全部存在就输出成功提示
- 遍历每个天数文件夹,逐个检查
自定义调整建议
- 如果你的文件名不是
file1.txt这类,直接修改$requiredFiles数组即可 - 如果你希望发现错误就立即终止脚本,把
continue改成exit 1就行 - 要是需要把校验结果输出到日志文件,可以在脚本开头加
Start-Transcript -Path "校验日志.txt",结尾加Stop-Transcript
内容的提问来源于stack exchange,提问作者user9596467
相关产品推荐
相关产品推荐

