如何在PowerShell中实现文件名查询及未匹配文件名写入文本功能
完善后的PowerShell脚本:检查PDF文件并处理已存在/未存在的情况
以下是针对需求完善后的脚本,修复了原脚本缺失的判断逻辑,同时优化了执行效率和健壮性:
$pdfDir = "C:\Users\user\Downloads" $contentFile = "C:\Users\user\Downloads\content.txt" # 确保记录文件存在,避免后续读取异常 if (-not (Test-Path -Path $contentFile)) { New-Item -Path $contentFile -ItemType File | Out-Null } # 获取目标文件夹下所有PDF文件(仅文件,排除目录) $pdfFiles = Get-ChildItem -Path $pdfDir -Filter "*.pdf" -File # 无PDF文件时直接退出 if ($pdfFiles.Count -eq 0) { Write-Host "未找到任何PDF文件" Exit } # 读取已记录的文件名到集合,提升查询效率 $existingNames = Get-Content -Path $contentFile | Where-Object { $_ -ne "" } foreach ($file in $pdfFiles) { $fileName = $file.Name if ($existingNames -contains $fileName) { # --- 文件已存在记录时执行的步骤 --- Write-Host "已处理文件: $fileName" # 示例操作:移动到已归档文件夹 # Move-Item -Path $file.FullName -Destination "C:\Users\user\Downloads\Archived\" } else { # --- 文件未存在记录时执行的步骤 --- Write-Host "处理新文件: $fileName" # 示例操作:调用工具处理PDF # & "C:\Program Files\PDFTool\pdftool.exe" $file.FullName # 将文件名写入记录文件 Add-Content -Path $contentFile -Value $fileName } }
关键改进说明
- 路径规范:将文件夹路径与文件筛选分离,使用
Get-ChildItem -Filter比直接在路径中写*.pdf更高效、更符合PowerShell最佳实践 - 健壮性提升:提前检查并创建
content.txt,避免因文件不存在导致的读取错误 - 效率优化:一次性读取所有已记录文件名到集合,避免循环中重复读取文件
- 逻辑补全:完善了文件名存在性判断的核心逻辑,补充了完整的
if/else分支 - 空值处理:过滤
content.txt中的空行,避免无效匹配
内容的提问来源于stack exchange,提问作者Karolsweats
相关产品推荐
相关产品推荐

