起初看到这个题目的时候都觉得不太可能,批处理还能做这个事?看完了以后,真觉得可能,只不过是用到了我没有常用到的hh.exe,来看看代码吧
- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- :: chm文件反编译器 V1.3
- ::
- :: 功能:
- :: 单个/批量反编译chm文件,并保持资源的原始结构。
- :: 使用方式有两种:
- :: ① 把单个或多个文件直接拖放到本程序。
- :: ② 直接双击运行。此时处理的是当前目录下所有以.chm为后缀的文件
- :: 执行过程及处理效果:
- :: 因为 hh -decompile 语句不能使用引号,所以,先把原始资源释放到
- :: 短文件名格式的文件夹中,释放完毕后再改名;
- :: 两种执行方式都有简单的容错处理;反编译后的资源放在单独的文件夹
- :: 中,此文件夹位于当前目录,并以chm文件名命名。
- :: 无法识别不以.chm为后缀名的chm文件,但是可以识别以.chm为后缀名
- ::的其他文件(貌似有点拗口^_^)
- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- @echo off
- set TT=chm文件反编译器 1.3
- echo.&echo.&echo 正在反编译CHM文件,请稍候...
- cd /d "%~dp0"
- :: 以拖动文件到批处理文件上的方式运行批处理时,%cd% 的值将会强制转换为
- :: %homepath%,因此,上一条语句非常关键!
- set "destination=chm文件反编译结果"
- for /f "delims=" %%i in ("%destination%") do set "destination_short=%%~sfi"
- md "%destination%" 2>nul
- del /a /f "%destination%\伪chm文件列表.txt" 2>nul
- if "%~1"=="" goto All
- :Some
- set str=%*
- set "str=%str:"=%"
- set "str= %str%"
- call set "str=%%str: %~d1=" "%~d1%%"
- for %%i in ("%str%") do (
- if not %%i=="" (
- title %TT%-正在处理"%%~nxi"
- if /i not "%%~xi"==".chm" (
- echo.&echo "%%~nxi"不是chm文件
- echo.&echo 请按任意键继续...
- pause>nul
- cls
- echo.&echo.&echo 正在反编译CHM文件,请稍候...
- ) else (
- rd /q /s "%%~ni" 2>nul
- hh -decompile %destination_short%\%%~sni %%~sfi
- if not exist "%destination%\%%~sni" (
- echo "%%~nxi">>"%destination%\伪chm文件列表.txt"
- ) else (
- ren "%destination%\%%~sni" "%%~ni" 2>nul
- )
- )
- )
- )
- exit
- :All
- for /f "delims=" %%i in ('dir /a-d /b *.chm 2^>nul') do (
- title %TT%-正在处理"%%~nxi"
- rd /q /s "%destination%\%%~ni" 2>nul
- hh -decompile %destination_short%\%%~sni %%~sfi
- if not exist "%destination%\%%~sni" (
- echo "%%~nxi">>"%destination%\伪chm文件列表.txt"
- ) else (
- ren "%destination%\%%~sni" "%%~ni" 2>nul
- )
- )
作者不光用后缀名的方式进行了判断,还在处理完成后判断是不是伪chm文件列表,这点做的不错,除了这个以外,还有一点收获,在cmd中输入hh.exe 磁盘名称,看看有什么效果,不错,打开了相应的盘符,以前都是用start 磁盘盘符打开的,又学了一手。
本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/413438,如需转载请自行联系原作者