PowerShell脚本如何检测目录中多个指定文件是否已完成解压
解决思路与修正脚本
你的问题出在原脚本的逻辑判断上:当目标文件还未出现时,Get-ChildItem会返回空集合,后续的Test-Path没有有效输入,导致-notcontains $false错误判定为$true,提前终止循环。
以下是修正后的方案,核心是逐个验证目标文件的存在性,确保所有文件都出现后再继续:
修正脚本(兼容所有PowerShell版本)
# 定义需要等待的目标文件名列表 $targetFiles = @("file1.txt", "file2.txt", "file3.txt") # 替换为你的目标文件夹路径 $targetDir = "C:\Your\Target\Directory" do { # 检查每个文件是否在目标目录(含子目录)存在 $missingFiles = $targetFiles | Where-Object { -not (Test-Path -Path (Join-Path $targetDir $_) -Recurse) } if (-not $missingFiles) { Write-Host "All files extracted. Continuing..." break } # 每次循环等待1秒,避免过度占用CPU Start-Sleep -Seconds 1 } while ($true)
简化写法(PowerShell 7+支持)
如果使用PowerShell 7及以上版本,可以用-All运算符简化判断:
$targetFiles = @("file1.txt", "file2.txt", "file3.txt") $targetDir = "C:\Your\Target\Directory" do { $allExists = $targetFiles.All({ Test-Path (Join-Path $targetDir $_) -Recurse }) if ($allExists) { Write-Host "All files extracted. Continuing..." break } Start-Sleep -Seconds 1 } while ($true)
关键改进点
- 精准验证每个文件:不再依赖
Get-ChildItem的结果,直接针对每个目标文件做存在性检查,避免空集合导致的误判。 - 添加等待间隔:通过
Start-Sleep降低循环频率,减少系统资源消耗。 - 可选缺失反馈:如果需要调试,可以在循环中添加
Write-Host "Waiting for: $($missingFiles -join ', ')",实时查看当前缺失的文件。
内容的提问来源于stack exchange,提问作者Harlan
相关产品推荐
相关产品推荐

