|
源代码如下:
@echo off
title shell32.dll自动精简美化工具 S32Lite V1.6.9.0906
mode con cols=90 lines=30
setlocal enabledelayedexpansion
for %%a in (avi bmp icons resource source dest backup) do if not exist %%a md %%a
echo ╔════════════════════════╗
echo ║ ║
echo ║ S23Lite V1.6.9.0906 NicTense写于2009.09.06 ║
echo ║ ║
echo ╚════════════════════════╝
if not exist empty.ico goto error2
if not exist reshacker.exe goto error3
if not exist source\shell32.dll (
echo.
echo 文件 source\shell32.dll 不存在,是否从当前系统中复制?(1 是 2 否)
echo.
set /p o= 请输入您的选择编号(直接回车视同1):
set o=!o:~0,1!
if "!o!"=="2" set o=2
if "!o!"=="2" goto error1
copy %windir%\system32\shell32.dll source\shell32.dll>nul
)
set allavi=150 151 152 160 161 162 163 164 165 166 167 168 169 170
set liteavi=150 162 163 164 165 166 167 168 169 170
set allbmp=130 131 133 134 135 136 137 138 140 141 142 143 145 146 147 148 149 204 205 206 207 214 215 216 217 225 226 227 228 230 231 240 241 242 245 246 247 309 310 369 390 14351 14353 14354 14355 14356
set litebmp=137 245 246 247 369 390 14351 14353 14354 14355 14356
set litebmpxp=130 146 147 148 149
set replacebmp=240 241 242
set allicons=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 133 134 135 137 138 139 140 141 142 143 144 145 146 147 148 151 152 153 154 155 156 157 160 161 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 191 192 193 194 196 197 198 199 200 210 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 281 282 283 284 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 337 338 512 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 8240 16710 16715 16717 16718 16721
set liteicons=15 16 17 19 20 22 23 25 26 27 28 31 34 36 38 39 42 43 44 45 46 47 48 49 50 51 52 53 54 133 135 140 141 142 143 144 145 146 147 148 156 157 165 168 169 170 171 172 174 175 176 177 178 179 180 181 191 192 193 194 196 197 198 199 200 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 236 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 281 282 283 284 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 308 309 310 311 312 313 314 315 316 317 318 319 320 321 324 325 331 337 338 512 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 8240 16710 16715 16717 16718 16721
set liteicons2003=339
set peicons=1 2 3 4 5 6 7 8 9 10 11 12 13 14 18 21 24 29 30 32 33 35 37 40 41 134 137 138 139 151 152 153 154 155 160 161 166 167 173 182 183 184 185 186 187 210 235 237 238 307 322 323 326 327 328 329 330
set sidebaricons=20 23 240 241 242 243 244 253 263 265 271 319
echo.
echo S32Lite可用于精简和美化shell32.dll文件以及提取相应资源,目前仅适于用xp和2003版本
:menu
echo.
echo 1 默认精简 保留PE相关图标;搜索、复制和移动文件动画以及必要的位图,精简多余资源
echo 2 最大精简 在默认精简的基础上删除工具栏大图标以及很少用到的位图,删除复制移动动画
echo 3 替换资源 用avi、bmp和icons目录中的资源文件替换shell32.dll文件中对应的资源
echo 4 提取资源 将shell32.dll中的动画、位图和图标资源分别提取到avi、bmp和icons目录中
echo 5 清空文件 清空上次操作留在avi、bmp和icons目录中的文件
echo 9 退出
echo.
:input1
set /p o= 请输入您要进行的操作的编号:
set o=%o:~0,1%
if "%o%"=="1" set o=1
if "%o%"=="2" set o=2
if "%o%"=="3" set o=3
if "%o%"=="4" set o=4
if "%o%"=="5" set o=5
if "%o%"=="9" set o=9
if "%o%"=="1" goto lite
if "%o%"=="2" goto maxlite
if "%o%"=="3" goto replace
if "%o%"=="4" goto getresource
if "%o%"=="5" goto deletefiles
if "%o%"=="9" exit
goto input1
:maxlite
set liteavi=150 151 152 160 161 162 163 164 165 166 167 168 169 170
set litebmp=137 204 205 214 215 227 228 241 242 245 246 247 310 369 390 14351 14353 14354 14355 14356
set replacebmp=240
echo.
echo 您选择的是最大精简模式
echo.
echo 是否保留大小约12K的搜索小动画?(1 保留 2 不保留)
echo.
set o=
set /p o= 请输入您的选择编号(直接回车视同1):
set o=%o:~0,1%
if "%o%"=="2" set o=2
if "%o%"=="2" goto lite
for %%a in (151 152) do if exist resource\%%a.avi if not exist avi\%%a.avi copy /y resource\%%a.avi avi\%%a.avi >nul
:lite
echo.
echo 是否保留常见任务栏图标?(1 保留 2 不保留)
echo.
set o=
set /p o= 请输入您的选择编号(直接回车视同1):
set o=%o:~0,1%
if not "%o%"=="2" if not "%o%"=="2" goto sidebar
echo.
echo 您选择不保留常见任务栏图标
:startlite
if exist dest\shell32.dll (
move /y dest\shell32.dll backup >nul
echo.
echo 文件 dest\shell32.dll 已备份到bakcup目录中
)
echo.
set /p=正在精简shell32.dll,请稍候...<nul
call :inittmp
::精简动画
for %%a in (%liteavi%) do if not exist avi\%%a.avi echo -delete avi,%%a,>>lite.tmp
::精简位图
for %%a in (%replacebmp%) do if not exist "bmp\%%a.bmp" if exist "resource\%%a.bmp" copy /y resource\%%a.bmp bmp >nul
for %%a in (%litebmp%) do if not exist bmp\%%a.bmp echo -delete bitmap,%%a,>>lite.tmp
::精简图标组
for %%a in (%liteicons%) do if not exist "icons\%%a.ico" echo -modify empty.ico,icongroup,%%a,>>lite.tmp
::替换avi、bmp、icons目录下文件所对应的资源
set o=1&set m=lite&goto replaceavi
:sidebar
for %%a in (%sidebaricons%) do if not exist icons\%%a.ico if exist resource\sidebar\%%a.ico copy /y resource\sidebar\%%a.ico icons\%%a.ico >nul
goto startlite
:replace
echo.
echo 请将要替换的动画、位图和图标文件分别放进avi、bmp和icons目录中
echo.
echo 1 替换所有资源 2 仅替换动画 3 仅替换位图 4 仅替换图标
if exist dest\shell32.dll (
move /y dest\shell32.dll backup >nul
echo.
echo 文件 dest\shell32.dll 已备份到bakcup目录中
)
call :inittmp
set m=replace
echo.
:input2
set o=
set /p o= 请输入您要进行的操作的编号:
set o=%o:~0,1%
if "%o%"=="1" set o=1
if "%o%"=="2" set o=2
if "%o%"=="3" set o=3
if "%o%"=="4" set o=4
if "%o%"=="1" echo.&set /p=正在替换资源...<nul&goto replaceavi
if "%o%"=="2" echo.&set /p=正在替换动画...<nul&goto replaceavi
if "%o%"=="3" echo.&set /p=正在替换位图...<nul&goto replacebmp
if "%o%"=="4" echo.&set /p=正在替换图标...<nul&goto replaceicons
goto input2
:replaceavi
::替换动画
for %%a in (%allavi%) do if exist "avi\%%a.avi" echo -addoverwrite avi\%%a.avi,avi,%%a,>>lite.tmp
if "%o%"=="1" goto replacebmp
goto doreshacker
:replacebmp
::替换位图,由于2003的shell32.dll少了几个位图,所以这里先判断版本做不同处理
call :getver
if "!v!"=="3" set allbmp=133 134 135 136 137 138 140 141 142 143 145 204 205 206 207 214 215 216 217 225 226 227 228 230 231 240 241 242 245 246 247 309 310 369 390 14351 14353 14354 14355 14356
for %%a in (%allbmp%) do if exist "bmp\%%a.bmp" echo -addoverwrite bmp\%%a.bmp,bitmap,%%a,>>lite.tmp
if "%o%"=="1" goto replaceicons
goto doreshacker
:replaceicons
::替换图标组,由于2003的shell32.dll多了一个图标组,所以需要做不同处理
call :getver
if "!v!"=="3" set allicons=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 133 134 135 137 138 139 140 141 142 143 144 145 146 147 148 151 152 153 154 155 156 157 160 161 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 191 192 193 194 196 197 198 199 200 210 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 281 282 283 284 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 337 338 339 512 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 8240 16710 16715 16717 16718 16721
for %%a in (%allicons%) do if exist "icons\%%a.ico" echo -addoverwrite icons\%%a.ico,icongroup,%%a,>>lite.tmp
goto doreshacker
:getresource
echo.
echo 1 提取所有资源 2 仅提取动画 3 仅提取位图 4 提取所有图标 5 仅提取PE图标
echo.
:input3
set o=
set /p o= 请输入您要进行的操作的编号:
set o=%o:~0,1%
if "%o%"=="1" set o=1
if "%o%"=="2" set o=2
if "%o%"=="3" set o=3
if "%o%"=="4" set o=4
if "%o%"=="5" set o=5
if "%o%"=="1" echo.&echo 原avi、bmp、icons目录中的文件已备份到backup目录中&echo.&set /p=正在提取资源...<nul&goto getavi
if "%o%"=="2" echo.&echo 原avi目录中的文件已备份到backup\avi目录中&echo.&set /p=正在提取动画...<nul&goto getavi
if "%o%"=="3" echo.&echo 原bmp目录中的文件已备份到backup\bmp目录中&echo.&set /p=正在提取位图...<nul&goto getbmp
if "%o%"=="4" echo.&echo 原icons目录中的文件已备份到backup\icons目录中&echo.&set /p=正在提取图标...<nul&goto geticons
if "%o%"=="5" goto getpeicons
goto input3
:getavi
if not exist backup\avi\nul md backup\avi
move /y avi\*.* backup\avi >nul 2>nul
if not exist avi\nul md avi
::提取动画
reshacker.exe -extract source\shell32.dll,avi\avi.rc,avi,,
if exist avi\avi.rc (
for /f "tokens=1,3" %%i in (avi\avi.rc) do ren avi\%%~j %%i%%~xj
del avi\avi.rc /q>nul
)
if "%o%"=="2" echo 完成! &echo.&goto menu
:getbmp
if not exist backup\bmp\nul md backup\bmp
move /y bmp\*.* backup\bmp >nul 2>nul
if not exist bmp\nul md bmp
::提取位图
reshacker.exe -extract source\shell32.dll,bmp\bmp.rc,bitmap,,
if exist bmp\bmp.rc (
for /f "tokens=1,3" %%i in (bmp\bmp.rc) do ren bmp\%%~j %%i%%~xj
del bmp\bmp.rc /q>nul
)
if "%o%"=="3" echo 完成! &echo.&goto menu
:geticons
if not exist backup\icons\nul md backup\icons
move /y icons\*.* backup\icons >nul 2>nul
if not exist icons\nul md icons
::提取图标组
reshacker.exe -extract source\shell32.dll,icons\icons.rc,icongroup,,
if exist icons\icons.rc (
for /f "tokens=1,3" %%i in (icons\icons.rc) do ren icons\%%~j %%i%%~xj
del icons\icons.rc /q>nul
)
echo 完成! &echo.&goto menu
:getpeicons
if not exist backup\icons\nul md backup\icons
move /y icons\*.* backup\icons >nul 2>nul
if not exist icons\nul md icons
call :inittmp
echo.
echo 原icons目录中的文件已备份到backup\icons目录中
echo.
echo 1 提取所有PE图标 2 仅提取PE基本图标 3、仅提取常见任务栏图标
echo.
set o=
set /p o= 请输入您的选择编号(直接回车视同1):
set o=%o:~0,1%
if "%o%"=="2" set o=2
if "%o%"=="3" set o=3
if "%o%"=="3" echo.&set /p= 正在提取常见任务栏图标...<nul & goto getsidebaricons
echo.&set /p= 正在提取PE图标...<nul
:getbasepeicons
for %%a in (%peicons%) do echo -extract icons\%%a.ico,icongroup,%%a,>>lite.tmp
if "%o%"=="2" goto dogetpeicons
:getsidebaricons
for %%a in (%sidebaricons%) do echo -extract icons\%%a.ico,icongroup,%%a,>>lite.tmp
:dogetpeicons
reshacker.exe -script lite.tmp
if not exist icons\1.ico if not exist icons\20.ico for /f "skip=4 tokens=1,2 delims= " %%i in (lite.tmp) do reshacker.exe -extract source\shell32.dll,%%j
del lite.tmp >nul 2>nul
echo 完成!&echo.&goto menu
:deletefiles
echo.
echo 清空avi、bmp、icons目录下的文件(1 备份后删除 2 直接删除 3、返回主菜单)
echo.
set o=
set /p o= 请输入您的选择编号(直接回车视同1):
set o=%o:~0,1%
if "%o%"=="2" set o=2
if "%o%"=="3" set o=3
if "%o%"=="2" goto deletefile
if "%o%"=="3" echo.&goto menu
for %%a in (avi bmp icons) do (
move /y %%a\*.* backup\%%a >nul 2>nul
if not exist %%a\nul md %%a
)
echo.
echo 删除完毕!原文件已备份到backup目录中
echo.&goto menu
:deletefile
del avi\*.* /q>nul
del bmp\*.* /q>nul
del icons\*.* /q>nul
echo.
echo 删除完毕!返回主菜单
echo.&goto menu
:error1
echo.
echo.
echo 请将您要精简美化的shell32.dll文件放到source目录下,然后重新运行本程序
goto end
:error2
echo.
echo.
echo 缺少文件empty.ico,请将该文件放到当前目录后重新运行本程序
goto end
:error3
echo.
echo.
echo 缺少文件reshacker.exe,请将该文件放到当前目录后重新运行本程序
goto end
:doreshacker
reshacker.exe -script lite.tmp
if not exist dest\shell32.dll (
copy source\shell32.dll dest\shell32.dll >nul
set /p=预计需要1-3分钟...<nul
for /f "skip=4 tokens=1,2 delims= " %%i in (lite.tmp) do (
if "%%i"=="-delete" reshacker.exe -delete dest\shell32.dll,dest\shell32.dll,%%j
if "%%i"=="-modify" reshacker.exe -modify dest\shell32.dll,dest\shell32.dll,%%j
if "%%i"=="-addoverwrite" reshacker.exe -addoverwrite dest\shell32.dll,dest\shell32.dll,%%j
if "%%i"=="-extract" reshacker.exe -extract dest\shell32.dll,%%j
)
)
del lite.tmp /q>nul
if "%m%"=="lite" (
::删除xp需要额外精简的位图资源
if "!v!"=="2" for %%a in (%litebmpxp%) do if not exist bmp\%%a.bmp reshacker.exe -delete dest\shell32.dll,dest\shell32.dll,bitmap,%%a,
::删除2003需要额外精简的图标资源
if "!v!"=="3" for %%a in (%liteicons2003%) do if not exist icons\%%a.icons reshacker.exe -delete dest\shell32.dll,dest\shell32.dll,icongroup,%%a,
)
echo 完成!目标文件已保存为 dest\shell32.dll
goto end
:end
set allavi=
set liteavi=
set allbmp=
set litebmp=
set litebmpxp=
set replacebmp=
set allicons=
set liteicons=
set liteicons2003=
set peicons=
set sidebaricons=
set o=
echo.
echo 无忧论坛PE讨论区 NicTense 写于2009.09.06
echo 如有疑问或问题反馈请到以下地址:bbs.wuyou.net/forum.php?mod=viewthread&tid=143138
echo.
echo 按任意键退出...
PAUSE>nul
exit
:inittmp
echo [FILENAMES]>lite.tmp
echo Exe=source\shell32.dll>>lite.tmp
echo SaveAs=dest\shell32.dll>>lite.tmp
echo [COMMANDS]>>lite.tmp
goto :eof
:getver
if exist filever.exe if exist source\shell32.dll (
for /f "tokens=4" %%a in ('filever.exe /a /d source\shell32.dll') do set v=%%a
set v=!v:~4,1!
)
goto :eof |
|