如何编写带两个入参、返回0/1的PowerShell文件存在检测脚本
PowerShell 文件名列表递归检索脚本实现
需求规则
- 入参1:文本文件路径,文件内逐行存储待查找的文件名,示例值:
a.txt、test.dll - 入参2:搜索根目录路径,目录下可包含多层嵌套子文件夹
- 执行逻辑:
- 递归遍历搜索根目录下所有子文件夹,匹配待查文件名列表
- 任意一个待查文件名存在,脚本返回退出码
1 - 所有待查文件名均不存在,脚本返回退出码
0
原有未完成代码问题
现有代码仅实现了参数定义、文件名列表遍历、基础搜索逻辑,缺少搜索结果判断、命中即终止、退出码返回、异常场景兼容的处理,原代码如下:
param( [parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string] $textFilePath, [parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string] $searchDirectory ) foreach($FileName in [System.IO.File]::ReadLines($textFilePath)) { Get-ChildItem -Path $searchDirectory -Filter $Filename -Recurse }
完整可用脚本
param( [parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$textFilePath, [parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$searchDirectory ) # 前置校验:输入路径不合法直接返回0 if (-not (Test-Path -Path $textFilePath -PathType Leaf)) { exit 0 } if (-not (Test-Path -Path $searchDirectory -PathType Container)) { exit 0 } # 逐行读取待查文件名,跳过空行 foreach($fileName in [System.IO.File]::ReadLines($textFilePath)) { if ([string]::IsNullOrWhiteSpace($fileName)) { continue } # 递归搜索匹配文件,命中第一个结果即终止当前搜索 $matchResult = Get-ChildItem -Path $searchDirectory -Filter $fileName -Recurse -File -ErrorAction SilentlyContinue | Select-Object -First 1 if ($matchResult) { # 命中任意文件直接返回1,终止整个脚本执行 exit 1 } } # 遍历完成无命中,返回0 exit 0
关键优化点说明
- 新增输入路径合法性校验,避免待查列表文件不存在、搜索根目录不存在时抛出异常
- 搜索时增加
-File参数,仅匹配文件对象,避免同名文件夹造成误判 - 搜索时增加
-ErrorAction SilentlyContinue,自动跳过无权限访问的系统目录、隐藏目录抛出的错误 - 搜索后追加
Select-Object -First 1,找到第一个匹配项就停止当前目录遍历,大幅降低大目录场景下的IO开销 - 命中文件后直接执行
exit 1终止脚本,无需继续遍历剩余待查文件名,提升执行效率 - 自动跳过待查列表中的空行,兼容文件末尾空行、误输入空行的场景
脚本执行完成后,可通过PowerShell内置变量
$LASTEXITCODE获取返回结果,1代表存在匹配文件,0代表无匹配文件。
内容的提问来源于stack exchange,提问作者sun
相关产品推荐
相关产品推荐

