求助编写PowerShell脚本:批量识别并迁移伪装为PDF的Zip文件
嘿,这个需求完全可以用PowerShell轻松实现,我帮你梳理清楚思路,再给你现成的脚本参考,你直接调整路径就能用~
核心实现思路
其实逻辑很简单,拆解成几步就好:
- 自动定位脚本所在的目录,批量抓取所有PDF文件
- 只读取每个文件的前2个字节(重点!7万个文件绝对不能读整个文件,太影响效率)
- 判断前两个字节是不是Zip文件的标志性开头
PK,是的话移到指定目录,不是就跳过
现成脚本(直接可用)
# 配置:把伪装成PDF的Zip文件移动到这个目录,你可以改成自己想要的路径 $targetDir = Join-Path -Path $PSScriptRoot -ChildPath "FakePDF_Zips" # 如果目标目录不存在,自动创建,避免报错 if (-not (Test-Path -Path $targetDir)) { New-Item -Path $targetDir -ItemType Directory | Out-Null } # 遍历脚本所在目录下的所有PDF文件(要包含子目录的话,加 -Recurse 参数) Get-ChildItem -Path $PSScriptRoot -Filter "*.pdf" -File | ForEach-Object { $currentFile = $_ Write-Host "正在处理: $($currentFile.Name)" # 只读取文件前2个字节,高效判断文件类型 $fileStream = $currentFile.OpenRead() $byteBuffer = New-Object byte[] 2 $null = $fileStream.Read($byteBuffer, 0, 2) $fileStream.Close() # 把字节转成ASCII字符串,对比是否是Zip的"PK"开头 $fileHeader = [System.Text.Encoding]::ASCII.GetString($byteBuffer) if ($fileHeader -eq "PK") { Write-Host "✅ 发现伪装Zip: $($currentFile.Name),正在移动..." # 移动文件,-Force 会自动处理重名(加数字后缀),-ErrorAction 避免权限问题中断脚本 Move-Item -Path $currentFile.FullName -Destination $targetDir -Force -ErrorAction SilentlyContinue } else { Write-Host "❌ $($currentFile.Name) 不是伪装Zip,跳过" } } Write-Host `n"处理完成!所有伪装PDF的Zip已移至: $targetDir"
关键细节解释
$PSScriptRoot:这个变量会自动获取脚本所在的目录,不用你硬写路径,脚本放哪里都能正常工作- 只读前2字节:用
OpenRead()打开文件流,只读前2个字节,比Get-Content快N倍,处理7万个文件绝对要这么做 - 重名处理:
Move-Item的-Force参数会自动给重名文件加数字后缀(比如file.pdf变成file(1).pdf),避免覆盖文件 - 错误处理:
-ErrorAction SilentlyContinue可以跳过权限不足或者其他小问题,让脚本继续处理剩下的文件
额外:批量解压这些伪装Zip
移动完成后,你可以用下面的脚本批量解压这些文件(因为它们现在还是.pdf后缀,先改成.zip再解压更稳妥):
$zipDir = Join-Path -Path $PSScriptRoot -ChildPath "FakePDF_Zips" Get-ChildItem -Path $zipDir -Filter "*.pdf" -File | ForEach-Object { # 把后缀改成.zip,确保解压工具能识别 $zipFile = Rename-Item -Path $_.FullName -NewName "$($_.BaseName).zip" -PassThru # 创建对应文件夹存放解压内容 $extractFolder = Join-Path -Path $zipDir -ChildPath $zipFile.BaseName Expand-Archive -Path $zipFile.FullName -DestinationPath $extractFolder -Force } Write-Host "所有Zip文件已解压完成!"
测试建议
先拿几个样本文件(比如1个伪装Zip的PDF,1个损坏的PDF)测试脚本,确认逻辑没问题后,再跑7万个文件,避免误操作~
内容的提问来源于stack exchange,提问作者Fnkraf
相关产品推荐
相关产品推荐

