描述:DeepSeek生成的工具

使用方法:ANSI编码记事本保存为bat格式文件

说明:有错误的话可以留言或者自己找AI改下

@echo off
title 安装监控工具(精确匹配版 - 仅输出Path与ProcessName)
setlocal enabledelayedexpansion

REM ======================= 自动提权 =======================
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo 正在请求管理员权限...
    powershell -Command "Start-Process '%0' -Verb RunAs -WindowStyle Maximized"
    exit /b
)

REM ======================= 检查管理员权限(提权后再次确认) =======================
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo [错误] 无法获取管理员权限,请右键以管理员身份运行。
    pause
    exit /b 1
)

REM ======================= 定义路径 =======================
set "PROCMON_URL=https://download.sysinternals.com/files/ProcessMonitor.zip"
set "PROCMON_ZIP_PATH=%TEMP%\Procmon.zip"
set "PROCMON_PATH=%TEMP%\Procmon.exe"
set "PML_FILE=%TEMP%\InstallMonitor.pml"
set "CSV_FILE=%TEMP%\InstallMonitor.csv"
set "OUTPUT_FILE=%TEMP%\MonitoredPaths.txt"
set "TEMP_PS1=%TEMP%\FilterEvents.ps1"

echo ==================== Process Monitor 安装监控工具(仅输出Path+ProcessName) ====================

REM ======================= 1. 下载 Process Monitor =======================
if not exist "%PROCMON_PATH%" (
    echo [1/7] 正在下载 Process Monitor...
    powershell -Command "Invoke-WebRequest -Uri '%PROCMON_URL%' -OutFile '%PROCMON_ZIP_PATH%' -UseBasicParsing"
    if errorlevel 1 (
        echo [错误] 下载失败,请检查网络连接。
        pause
        exit /b 1
    )
    powershell -Command "Expand-Archive '%PROCMON_ZIP_PATH%' -DestinationPath '%TEMP%' -Force"
    echo [完成] 下载成功。
) else (
    echo [1/7] Process Monitor 已存在,跳过下载。
)

REM ======================= 2. 重置 Process Monitor 状态 =======================
echo [2/7] 正在重置 Process Monitor 为默认状态...
taskkill /f /im Procmon.exe >nul 2>&1
if exist "%PML_FILE%" del "%PML_FILE%" >nul 2>&1
echo [完成] 已清理旧进程和日志文件。

REM ======================= 3. 获取要筛选的进程名(精确匹配) =======================
echo.
echo [3/7] 请输入安装程序的完整进程名(精确匹配,多个用逗号分隔):
echo      获取进程名的方法:
echo        1. 运行安装程序(此时不要关闭)。
echo        2. 打开任务管理器(Ctrl+Shift+Esc)。
echo        3. 切换到“详细信息”标签页。
echo        4. 找到安装程序的进程,复制其“名称”列的内容(例如 WeChatSetup.exe)。
echo      注意:必须包含扩展名 .exe,大小写不敏感。
echo      示例:WeChatSetup.exe  或  WeChatSetup.exe,msiexec.exe
set /p "PROCESS_NAMES=进程名:"
if "%PROCESS_NAMES%"=="" (
    echo [警告] 未输入进程名,将显示所有进程的更改。
    set "FILTER_MODE=0"
) else (
    set "FILTER_MODE=1"
    echo [信息] 将精确匹配以下进程:%PROCESS_NAMES%
)

REM ======================= 4. 启动捕获 =======================
echo.
echo [4/7] 正在启动 Process Monitor(最小化)...
start "" "%PROCMON_PATH%" /AcceptEula /Minimized /BackingFile "%PML_FILE%"
timeout /t 2 /nobreak >nul

REM ======================= 5. 等待用户安装 =======================
echo.
echo [5/7] 请运行您要监控的安装程序(例如腾讯会议、微信等)。
echo      安装完成后,返回此窗口并按任意键停止捕获...
pause >nul

REM ======================= 6. 停止捕获 =======================
echo.
echo [6/7] 正在停止捕获并关闭 Process Monitor...
"%PROCMON_PATH%" /Terminate
timeout /t 2 /nobreak >nul

REM ======================= 7. 导出 CSV =======================
echo [7/7] 正在将捕获数据导出为 CSV(可能需要几十秒)...
"%PROCMON_PATH%" /AcceptEula /OpenLog "%PML_FILE%" /SaveAs "%CSV_FILE%" /NoFilter
if errorlevel 1 (
    echo [错误] 导出 CSV 失败,错误码:%errorlevel%
    echo 可能原因:PML 文件损坏、磁盘空间不足、或 ProcMon 命令行参数错误。
    echo 建议手动导出:
    echo   1. 打开 Process Monitor(运行 "%PROCMON_PATH%")。
    echo   2. 点击 File -> Open,选择 "%PML_FILE%"。
    echo   3. 点击 File -> Save As,选择 CSV 格式,保存为 "%CSV_FILE%"。
    echo   4. 保存后按任意键继续分析...
    pause >nul
    if not exist "%CSV_FILE%" (
        echo [错误] 未找到 CSV 文件,无法继续。
        pause
        exit /b 1
    ) else (
        echo [完成] 手动导出成功。
    )
) else (
    echo [完成] CSV 导出成功:%CSV_FILE%
)

REM ======================= 生成 PowerShell 分析脚本(仅输出Path与ProcessName,带进度条和统计) =======================
echo.
echo 正在生成分析脚本(仅输出 Path 和 Process Name)...
type nul > "%TEMP_PS1%" 2>nul
if errorlevel 1 (
    echo [错误] 无法创建临时脚本文件:%TEMP_PS1%
    pause
    exit /b 1
)

echo $csvFile = '%CSV_FILE%' >> "%TEMP_PS1%"
echo $outputFile = '%OUTPUT_FILE%' >> "%TEMP_PS1%"
if "%FILTER_MODE%"=="1" (
    echo $processNames = '%PROCESS_NAMES%' >> "%TEMP_PS1%"
) else (
    echo $processNames = '' >> "%TEMP_PS1%"
)
echo $filterMode = %FILTER_MODE% >> "%TEMP_PS1%"
echo. >> "%TEMP_PS1%"
echo Write-Progress -Activity "分析 Process Monitor 数据" -Status "正在导入 CSV..." -PercentComplete 0 >> "%TEMP_PS1%"
echo # 导入 CSV >> "%TEMP_PS1%"
echo $events = Import-Csv $csvFile -Encoding Default >> "%TEMP_PS1%"
echo if (-not $events) { >> "%TEMP_PS1%"
echo     Write-Host "未捕获到任何事件。" -ForegroundColor Red >> "%TEMP_PS1%"
echo     exit 1 >> "%TEMP_PS1%"
echo } >> "%TEMP_PS1%"
echo $totalEvents = $events.Count >> "%TEMP_PS1%"
echo Write-Host ("共捕获 " + $totalEvents + " 个事件。") -ForegroundColor Green >> "%TEMP_PS1%"
echo Write-Progress -Activity "分析 Process Monitor 数据" -Status "已导入 CSV" -PercentComplete 20 >> "%TEMP_PS1%"
echo. >> "%TEMP_PS1%"
echo # 精确筛选进程 >> "%TEMP_PS1%"
echo if ($filterMode -eq 1) { >> "%TEMP_PS1%"
echo     $names = $processNames -split ',' ^| ForEach-Object { $_.Trim() } >> "%TEMP_PS1%"
echo     Write-Progress -Activity "分析 Process Monitor 数据" -Status "正在按进程名筛选..." -PercentComplete 40 >> "%TEMP_PS1%"
echo     $filtered = $events ^| Where-Object { >> "%TEMP_PS1%"
echo         $proc = $_."Process Name" >> "%TEMP_PS1%"
echo         if ([string]::IsNullOrEmpty($proc)) { return $false } >> "%TEMP_PS1%"
echo         foreach ($n in $names) { >> "%TEMP_PS1%"
echo             if ($proc -eq $n) { return $true } >> "%TEMP_PS1%"
echo         } >> "%TEMP_PS1%"
echo         return $false >> "%TEMP_PS1%"
echo     } >> "%TEMP_PS1%"
echo     Write-Host ("筛选后剩余 " + $filtered.Count + " 个事件。") -ForegroundColor Green >> "%TEMP_PS1%"
echo     if ($filtered.Count -eq 0) { >> "%TEMP_PS1%"
echo         Write-Host "警告:未找到匹配的进程名,请检查输入的进程名是否正确。" -ForegroundColor Yellow >> "%TEMP_PS1%"
echo         Write-Host "CSV 中出现的进程名示例(前20个):" -ForegroundColor Yellow >> "%TEMP_PS1%"
echo         $events ^| Select-Object -ExpandProperty "Process Name" -Unique ^| Select-Object -First 20 ^| ForEach-Object { Write-Host "  - $_" } >> "%TEMP_PS1%"
echo         Write-Host "请确认进程名必须包含扩展名(如 .exe),且与上列完全一致。" -ForegroundColor Yellow >> "%TEMP_PS1%"
echo         exit 1 >> "%TEMP_PS1%"
echo     } >> "%TEMP_PS1%"
echo     $events = $filtered >> "%TEMP_PS1%"
echo } >> "%TEMP_PS1%"
echo. >> "%TEMP_PS1%"
echo # 仅保留文件路径和注册表路径(Path 列不为空) >> "%TEMP_PS1%"
echo Write-Progress -Activity "分析 Process Monitor 数据" -Status "正在过滤空路径..." -PercentComplete 60 >> "%TEMP_PS1%"
echo $events = $events ^| Where-Object { -not [string]::IsNullOrWhiteSpace($_.Path) } >> "%TEMP_PS1%"
echo Write-Host ("过滤空路径后剩余 " + $events.Count + " 个事件。") -ForegroundColor Green >> "%TEMP_PS1%"
echo. >> "%TEMP_PS1%"
echo # 仅输出 Path 和 Process Name,去重 >> "%TEMP_PS1%"
echo Write-Progress -Activity "分析 Process Monitor 数据" -Status "正在去重和排序..." -PercentComplete 80 >> "%TEMP_PS1%"
echo $result = $events ^| Select-Object -Property "Path", "Process Name" -Unique ^| Sort-Object "Path" >> "%TEMP_PS1%"
echo. >> "%TEMP_PS1%"
echo # 输出到文件 >> "%TEMP_PS1%"
echo $result ^| Export-Csv -Path $outputFile -NoTypeInformation -Encoding UTF8 >> "%TEMP_PS1%"
echo Write-Progress -Activity "分析 Process Monitor 数据" -Status "完成" -PercentComplete 100 -Completed >> "%TEMP_PS1%"
echo. >> "%TEMP_PS1%"
echo Write-Host "`n==================== 结果汇总 ====================" -ForegroundColor Cyan >> "%TEMP_PS1%"
echo Write-Host ("输出文件已保存至: $outputFile (" + $result.Count + " 个唯一路径)") -ForegroundColor Green >> "%TEMP_PS1%"
echo Write-Host "`n监控完成。文件为 CSV 格式,包含 Path 和 Process Name 两列。" -ForegroundColor Green >> "%TEMP_PS1%"
echo Write-Host "" >> "%TEMP_PS1%"
echo Write-Host "执行统计:" -ForegroundColor Yellow >> "%TEMP_PS1%"
echo Write-Host "  - 原始事件数: $totalEvents" -ForegroundColor White >> "%TEMP_PS1%"
echo if ($filterMode -eq 1) { >> "%TEMP_PS1%"
echo     Write-Host "  - 进程筛选后: $($filtered.Count)" -ForegroundColor White >> "%TEMP_PS1%"
echo } >> "%TEMP_PS1%"
echo Write-Host "  - 非空路径后: $($events.Count)" -ForegroundColor White >> "%TEMP_PS1%"
echo Write-Host "  - 唯一路径数: $($result.Count)" -ForegroundColor White >> "%TEMP_PS1%"

if not exist "%TEMP_PS1%" (
    echo [错误] 生成 PowerShell 脚本失败,文件不存在:%TEMP_PS1%
    pause
    exit /b 1
)
echo [完成] 分析脚本已生成:%TEMP_PS1%
REM ======================= 检查 PowerShell 执行策略 =======================
echo.
echo [检查] 正在检查 PowerShell 执行策略...
powershell -NoProfile -Command "& { $policy = Get-ExecutionPolicy; if ($policy -in 'Restricted','AllSigned') { Write-Host '警告:当前 PowerShell 执行策略为' $policy ',可能阻止脚本运行。' -ForegroundColor Yellow; Write-Host '建议:以管理员身份运行以下命令:Set-ExecutionPolicy RemoteSigned' -ForegroundColor Yellow; exit 1 } else { exit 0 } }"
if errorlevel 1 (
    echo [警告] PowerShell 执行策略限制,但脚本将使用 Bypass 参数尝试绕过。
    echo 如果后续分析失败,请按上述建议修改执行策略。
    pause
) else (
    echo [通过] PowerShell 执行策略正常。
)

REM ======================= 执行 PowerShell 分析 =======================
echo.
echo 正在分析 CSV 数据并筛选...
echo 执行命令:powershell -NoProfile -ExecutionPolicy Bypass -File "%TEMP_PS1%"
echo 分析过程可能需要几秒钟,请耐心等待...

set "PS_OUTPUT=%TEMP%\ps_output.txt"
powershell -NoProfile -ExecutionPolicy Bypass -File "%TEMP_PS1%" > "%PS_OUTPUT%" 2>&1
set "PS_EXIT=%errorlevel%"
type "%PS_OUTPUT%"
del "%PS_OUTPUT%" >nul 2>&1

if %PS_EXIT% equ 0 (
    echo.
    echo [成功] 分析执行成功!
    echo 结果文件已生成:%OUTPUT_FILE%
    echo 该文件为 CSV 格式,包含 Path 和 Process Name 两列。
) else (
    echo.
    echo [失败] 分析执行失败,错误码:%PS_EXIT%
    echo 请检查上述输出中的进程名示例,确认正确后重新运行脚本。
    pause
    exit /b 1
)

del "%TEMP_PS1%" >nul 2>&1

echo.
echo 按任意键退出...
pause >nul
exit /b 0

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐