You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助编写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"
关键细节解释
  1. $PSScriptRoot:这个变量会自动获取脚本所在的目录,不用你硬写路径,脚本放哪里都能正常工作
  2. 只读前2字节:用OpenRead()打开文件流,只读前2个字节,比Get-Content快N倍,处理7万个文件绝对要这么做
  3. 重名处理:Move-Item的-Force参数会自动给重名文件加数字后缀(比如file.pdf变成file(1).pdf),避免覆盖文件
  4. 错误处理:-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:23:31