| @setlocal enabledelayedexpansion |
| @set echo=off |
| @for /f "delims=" %%a in ('echo') do @( |
| if "%%a"=="ECHO 处于打开状态。" @set echo=on |
| if "%%a"=="ECHO is on." @set echo=on |
| ) |
| @echo off |
| |
| path .;!path! |
| |
| if /i "%~1" == "" goto :Usage |
| for %%a in ("%~1" "%~2" "%~3" "%~4" "%~5" "%~6" "%~7" "%~8" "%~9") do ( |
| if /i "%%~a" == "/?" goto :Usage |
| if /i "%%~a" == "/HELP" goto :Usage |
| ) |
| |
| set "RAR=" |
| for %%a in ("%~1" "%~2" "%~3" "%~4" "%~5" "%~6" "%~7" "%~8" "%~9") do ( |
| if /i "%%~a" == "/RAR" set RAR=true |
| ) |
| |
| for %%a in ("%~1" "%~2" "%~3" "%~4" "%~5" "%~6" "%~7" "%~8" "%~9") do ( |
| if exist %%~fa ( |
| set "file=%~1" |
| set "file~dpn=%~dpn1" |
| call :main |
| ) |
| ) |
| goto :End |
| |
| :End |
| ( |
| echo !echo! |
| endlocal |
| exit /b |
| ) |
| |
| :main |
| setlocal |
| set "count=0" |
| set "error=" |
| |
| path !file!\..;!path! |
| |
| for /f "skip=1 tokens=1,3" %%a in ('@"%~dpn0\peinfo" "!file!" /Subsystem /Machine') do ( |
| set "%%a=%%b" |
| ) |
| |
| echo 文件名: !file! |
| |
| if /i !Machine! == 0x0000 (echo 架构:UNKNOWN |
| ) else if /i !Machine! == 0x014c (echo 架构:Intel 386. |
| ) else if /i !Machine! == 0x0160 (echo 架构:big-endian |
| ) else if /i !Machine! == 0x0166 (echo 架构:MIPS little-endian |
| ) else if /i !Machine! == 0x0168 (echo 架构:MIPS little-endian |
| ) else if /i !Machine! == 0x0169 (echo 架构:MIPS little-endian WCE v2 |
| ) else if /i !Machine! == 0x0184 (echo 架构:Alpha_AXP |
| ) else if /i !Machine! == 0x01a2 (echo 架构:SH3 little-endian |
| ) else if /i !Machine! == 0x01a3 (echo 架构:SH3DSP |
| ) else if /i !Machine! == 0x01a4 (echo 架构:SH3E little-endian |
| ) else if /i !Machine! == 0x01a6 (echo 架构:SH4 little-endian |
| ) else if /i !Machine! == 0x01a8 (echo 架构:SH5 |
| ) else if /i !Machine! == 0x01c0 (echo 架构:ARM Little-Endian |
| ) else if /i !Machine! == 0x01c2 (echo 架构:THUMB |
| ) else if /i !Machine! == 0x01d3 (echo 架构:AM33 |
| ) else if /i !Machine! == 0x01F0 (echo 架构:IBM PowerPC Little-Endian |
| ) else if /i !Machine! == 0x01f1 (echo 架构:POWERPCFP |
| ) else if /i !Machine! == 0x0200 (echo 架构:Intel 64 |
| ) else if /i !Machine! == 0x0266 (echo 架构:MIPS |
| ) else if /i !Machine! == 0x0284 (echo 架构:ALPHA64 |
| ) else if /i !Machine! == 0x0366 (echo 架构:MIPS |
| ) else if /i !Machine! == 0x0466 (echo 架构:MIPS |
| ) else if /i !Machine! == 0x0284 (echo 架构:ALPHA64 |
| ) else if /i !Machine! == 0x0520 (echo 架构:Infineon |
| ) else if /i !Machine! == 0x0CEF (echo 架构:CEF |
| ) else if /i !Machine! == 0x0EBC (echo 架构:EFI Byte Code |
| ) else if /i !Machine! == 0x8664 (echo 架构:AMD64 (K8) |
| ) else if /i !Machine! == 0x9041 (echo 架构:M32R little-endian |
| ) else if /i !Machine! == 0xC0EE (echo 架构:CEE |
| ) else (echo Error: 获取 pe 信息失败 1>&2 & exit /b 1) |
| |
| if /i !Subsystem! == 0x0002 (echo 子系统:GUI |
| ) else if /i !Subsystem! == 0x0003 (echo 子系统:CLI |
| ) else (echo 子系统:UNKNOWN[!Subsystem!] |
| ) |
| |
| for /f "delims==" %%a in ('set dll[ 2^>nul') do set "%%a=" |
| |
| echo; |
| echo 依赖: |
| |
| if /i !Machine! == 0x014c ( |
| call :lddlist ldd file "%~2" |
| ) else if /i !Machine! == 0x8664 ( |
| call :lddlist ldd64 file "%~2" |
| ) |
| |
| if !count! == 0 ( |
| echo [无依赖] |
| ) else if defined error ( |
| echo; |
| echo Error: 未能取得所有 dll,跳过打包流程 |
| ) else if defined RAR ( |
| echo; |
| echo !file! |
| copy /y "!file!" "!file~dpn!\" |
| echo; |
| if not exist !file~dpn!.cmd call :writecmdfile>!file~dpn!.cmd |
| echo --------------------------------------------------------------------------- |
| "%~dpn0\rar" a -m5 -s "!file~dpn!.rar" "!file~dpn!.cmd" "!file~dpn!" |
| ) |
| |
| endlocal |
| exit /b |
| |
| :Usage |
| set "myname=%~nx0" |
| echo !myname! 查看或打包文件的所有 dll 库依赖 by CrLf [bbs.bathome.net] |
| echo; |
| echo !myname! FILES [/HELP] [/RAR] |
| echo; |
| echo FILES 指定一个或多个要处理的 exe 或 dll |
| echo /RAR 打包相关依赖文件为 Batch-CN 的格式 |
| echo /HELP 显示这个帮助 |
| echo; |
| echo 依赖第三方工具: Peinfo / ldd / ldd64 / rar |
| goto :End |
| |
| |
| :lddlist |
| for /f "skip=1 tokens=1,2 delims=>" %%a in ('@"%~dpn0\%~1" "!%~2!"') do ( |
| if not defined dll[%%~nxa] ( |
| for /f "tokens=*" %%c in ("%%b\..") do ( |
| if defined RAR echo; |
| |
| if /i %%~dpc == c:\windows\ ( |
| echo %%~nc : %%b |
| if defined RAR echo 跳过 |
| ) else ( |
| set "dllpath=%%b" |
| |
| for /f %%d in ("%%a") do ( |
| set "dllname=%%~nx$path:d" |
| set "dllpath=%%~f$path:d" |
| ) |
| |
| if defined dllpath ( |
| set /a count+=1 |
| echo !dllname! : !dllpath! |
| if defined RAR ( |
| md "!file~dpn!" 2>nul |
| if exist !file~dpn!\nul copy /y "!dllpath!" "!file~dpn!\" |
| ) |
| call :lddlist %1 dllpath "%~3" |
| ) else ( |
| set" error=true" |
| echo %%~nxb : 未在 %%path%% 中找到相应文件 |
| ) |
| ) |
| ) |
| set dll[%%a]=true |
| ) |
| ) |
| exit /b |
| |
| :writecmdfile |
| echo @"%%~dp0\%%~n0\%%~n0" %%* |
| exit /bCOPY |