开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

楼主: AfanPan
收起左侧

[易源码分享] DISM 映像服务调用实例 - 调用DismApi 无延迟读取/操作映像

[复制链接]
发表于 2023-4-16 16:11:32 | 显示全部楼层   河北省石家庄市
开源精神必须支持~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-16 14:20:49 | 显示全部楼层   浙江省嘉兴市
嫂子 发表于 2023-4-16 14:17
看你的代码 都没有自定义类型啊。
是不是这个DLL 本身是你写的

对呀,自己开发的DLL呀,方便易语言调用
回复 支持 反对

使用道具 举报

签到天数: 23 天

发表于 2023-4-16 14:17:18 | 显示全部楼层   浙江省金华市
AfanPan 发表于 2023-4-16 13:13
Dismapi的某些自定义数据类型,以及某些传址都是令人无语的,虽然不多

看你的代码 都没有自定义类型啊。
是不是这个DLL 本身是你写的
回复 支持 反对

使用道具 举报

结帖率:100% (7/7)

签到天数: 22 天

发表于 2023-4-16 13:57:02 | 显示全部楼层   湖北省咸宁市
开源精神必须支持~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-16 13:27:39 | 显示全部楼层   浙江省嘉兴市
青春的思念 发表于 2023-4-16 13:26
要是在乎这点损耗可以直接BAT

@echo off

我比较喜欢用gui的,BAT确实调用简单,但是我不太喜欢
回复 支持 反对

使用道具 举报

结帖率:95% (63/66)

签到天数: 13 天

发表于 2023-4-16 13:26:11 | 显示全部楼层   安徽省淮南市
AfanPan 发表于 2023-4-16 13:23
延迟确实比较大,因为2次显示直接差了4%的进度

要是在乎这点损耗可以直接BAT

@echo off
mode 75,40
cd /d "%~dp0"
setlocal enabledelayedexpansion
set vola=C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
set dd=%date:~5,2%%date:~8,2%
if %time:~0,2% leq 9 (set hh=0%time:~1,1%) else (set hh=%time:~0,2%)
set mm=%time:~3,2%
set ss=%time:~6,2%
call :setESC
:menu
echo.                      System Command Dism Tools
echo.
echo.                           1  系统   安装
echo.
echo.                           2  系统   备份
echo.
echo.                           3  系统   还原
echo.  
echo.                           4  镜像   挂载
echo.
echo.                           5  镜像   卸载
echo.
echo.                           6  WIM ^<-^> ESD
echo.
echo.                           7  WPE ^<-^> BOOT
echo.
echo.                           [Quit]^=^=^>^> EXIT
echo.
set /p  id=选择项目序号:
if "%id%"=="1" goto install
if "%id%"=="2" goto backup
if "%id%"=="3" goto restore
if "%id%"=="4" goto mountimage
if "%id%"=="5" goto unmount
if "%id%"=="6" goto wtoe
if "%id%"=="7" goto pezip
if /i "%id%"=="quit" exit
cls
goto menu

:install
echo.
set n=
for %%i in (%vola%) do (if exist %%i: set /a n+=1 &echo   !n! ^=^=^> %%i:)
echo.
:installerr1
set vid=
set /p vid=选择将要安装系统的驱动器:
if /i "%vid%"=="quit" cls&goto menu
if not exist %vid%: goto installerr1
for %%i in (%vola%) do (if /i %vid%==%%i set vid=%%i)
set vid=%vid%:
echo.
:installerr2
set fid=
set /p fid=选择存放安装文件的驱动器:
if /i "%fid%"=="quit" cls&goto menu
if not exist %fid%: goto installerr2
for %%i in (%vola%) do (if /i %fid%==%%i set fid=%%i)
set fid=%fid%:
echo.
set n=
cd /d %fid%\ &for /f %%i in ('dir /b /s *.wim,*.esd') do (set /a n+=1 &echo   !n! ^<^=^= %%i&set a!n!=%%i)
echo.
if not defined n goto installerr2
:installerr3
set fid=
set /p fid=选择文件序号:
if /i "%fid%"=="quit" cls&goto menu
if not defined fid  goto installerr3
set /a fid=fid
if %fid% leq 0 goto installerr3
if %fid% gtr %n% goto installerr3
If %fid% leq %n%  set fid=!a%fid%!
echo.
set n=
for /f "tokens=2 delims=:" %%i in ('dism.exe /get-wiminfo /wimfile:%fid% ^|find /i "dism.log"') do (
echo.%ESC%[31m  %fid% [文件损坏或格式未知]  %ESC%[0m &echo.&pause&cls&goto menu)
for /f "tokens=2 delims=:" %%i in ('dism.exe /get-wiminfo /wimfile:%fid% ^|find "Name"') do (set /a n+=1 &echo   !n! : %%i&set a!n!=%%i)
for /f "tokens=2 delims=:" %%i in ('dism.exe /get-wiminfo /wimfile:%fid% ^|find "名称"') do (set /a n+=1 &echo   !n! : %%i&set a!n!=%%i)
echo.
:installerr4
set index=
set /p index=选择索引序号:
if /i "%index%"=="quit" cls&goto menu  
if not defined index  goto installerr4
set /a index=index
if %index% leq 0 goto installerr4
if %index% gtr %n% goto installerr4
echo.
set fmid=
set /p fmid= %ESC%[31m  是否格式化安装系统的驱动器[%vid%]: 是(Y) 否(ANY) %ESC%[0m
if not defined fmid  set fmid=n
echo.
if /i %fmid%==y format %vid% /y /q /x /fs:ntfs
echo.
echo.%ESC%[92m  %fid% ^=^=^> %vid%  %ESC%[0m
echo.
dism.exe /apply-image  /imagefile:%fid% /index:%index% /applydir:%vid%\
echo.
echo.[=======================正在优化启动=======================]
echo.
dism.exe /Image:%vid%\ /Optimize-Image /Boot
echo.
bootsect.exe /nt60 %vid% /mbr
if exist %vid%\Boot\BCD del /q %vid%\Boot\BCD
if exist %vid%\EFI\Microsoft\Boot\BCD del /q %vid%\EFI\Microsoft\Boot\BCD
bcdboot.exe %vid%\Windows /s %vid% /l zh-CN /f ALL
REG.EXE LOAD HKLM\TempHive %vid%\Windows\System32\config\software
for /f "tokens=3,*" %%i in ('reg query "HKLM\TempHive\Microsoft\Windows NT\CurrentVersion"  /v  ProductName^|find "ProductName"') do set des=%%i %%j
REG.EXE UNLOAD HKLM\TempHive
if defined des bcdedit.exe -store %vid%\Boot\BCD -set {default} description "%des%"
if defined des bcdedit.exe -store %vid%\EFI\Microsoft\Boot\BCD -set {default} description "%des%"
echo.
echo 安装结束
echo.
pause&cls&goto menu

:backup
echo.
set n=
for %%i in (%vola%) do (if exist %%i: set /a n+=1 &echo   !n! ^=^=^> %%i:)
echo.
:backerr1
set vid=
set /p vid=选择将要备份的驱动器:
if /i "%vid%"=="quit" cls&goto menu
if not exist %vid%: goto backerr1
for %%i in (%vola%) do (if /i %vid%==%%i set vid=%%i)
set vid=%vid%:
echo.
:backerr2
set fid=
set /p fid=选择存放文件的驱动器:
if /i "%fid%"=="quit" cls&goto menu
if not exist %fid%: goto backerr2
for %%i in (%vola%) do (if /i %fid%==%%i set fid=%%i)
set fid=%fid%:
echo.
echo. %ESC%[92m  %vid% ^=^=^> %fid%\Sys_back\Sys_back_%dd%%hh%%mm%.wim %ESC%[0m
if not exist %fid%\Sys_back md %fid%\Sys_back
dism.exe /Capture-Image /ImageFile:%fid%\Sys_back\Sys_back_%dd%%hh%%mm%.wim ^
/CaptureDir:%vid% /Name:Sys_back /Compress:max /CheckIntegrity /Verify /ScratchDir:%fid%\
echo.
echo 备份结束.
echo.
pause&cls&goto menu

:restore
echo.
set n=
for %%i in (%vola%) do (if exist %%i: set /a n+=1 &echo   !n! ^=^=^> %%i:)
echo.
:restorerr1
set vid=
set /p vid=选择需要还原的驱动器:
if /i "%vid%"=="quit" cls&goto menu  
if not exist %vid%: goto restorerr1
for %%i in (%vola%) do (if /i %vid%==%%i set vid=%%i)
set vid=%vid%:
echo.
set n=
for %%i in (%vola%) do (if exist %%i:\Sys_back for %%i in (%%i:\Sys_back\*.wim,%%i:\Sys_back\*.esd) do (set /a n+=1 &echo   !n! : %%i&set a!n!=%%i))
if not defined n echo 没找到还原文件! 按任意键继续 .&pause>nul &cls&goto menu
echo.
:restorerr2
set fid=
set /p fid=选择存放文件的驱动器:
if /i "%fid%"=="quit" cls&goto menu
echo.
if not defined fid  goto restorerr2
set /a fid=fid
if %fid% leq 0 goto restorerr2
if %fid% gtr %n% goto restorerr2
If %fid% leq %n% set fid=!a%fid%!
for /f "tokens=2 delims=:" %%i in ('dism.exe /get-wiminfo /wimfile:%fid% ^|find /i "dism.log"') do (
echo.%ESC%[31m  %fid% [文件损坏或格式未知]  %ESC%[0m &echo.&pause&echo. &cls&goto menu)
set fmid=
set /p fmid=%ESC%[31m  是否格式化目标磁盘[%vid%]: 是(Y) 否(ANY)  %ESC%[0m
if not defined fmid  set fmid=n
echo.
if /i %fmid%==y format %vid% /y /q /x /fs:ntfs
echo.
echo.%ESC%[92m  %fid% ^=^=^> %vid%  %ESC%[0m
dism.exe /apply-image  /imagefile:%fid% /index:1 /applydir:%vid%\
bootsect.exe /nt60 %vid% /mbr
echo.
echo 还原结束
echo.
pause&cls&goto menu

:mountimage
echo.
set n=
for %%i in (%vola%) do (if exist %%i: set /a n+=1 &echo   !n! ^=^=^> %%i:)
echo.
:mountimageerr1
set vid=
set /p vid=选择挂载到那个驱动器:
if /i "%vid%"=="quit" cls&goto menu
if not exist %vid%: goto mountimageerr1
for %%i in (%vola%) do (if /i %vid%==%%i set vid=%%i)
set vid=%vid%:
echo.
:mountimageerr2
set fid=
set /p fid=选择存放文件的驱动器:
if /i "%fid%"=="quit" cls&goto menu
if not exist %fid%: goto mountimageerr2
for %%i in (%vola%) do (if /i %fid%==%%i set fid=%%i)
set fid=%fid%:
echo.
set n=
cd /d %fid%\ &for /f %%i in ('dir /b /s *.wim') do (set /a n+=1 &echo   !n! ^<^=^= %%i&set a!n!=%%i)
echo.
if not defined n goto mountimageerr2
:mountimageerr3
set fid=
set /p fid=选择文件序号:
if /i "%fid%"=="quit" cls&goto menu
if not defined fid  goto mountimageerr3
set /a fid=fid
if %fid% leq 0 goto mountimageerr3
if %fid% gtr %n% goto mountimageerr3
If %fid% leq %n%  set fid=!a%fid%!
echo.
for /f "tokens=2 delims=:" %%i in ('dism.exe /get-wiminfo /wimfile:%fid% ^|find /i "dism.log"') do (
echo.%ESC%[31m  %fid% [文件损坏或格式未知]  %ESC%[0m &echo.&pause&echo. &cls&goto menu)
set n=
for /f "tokens=2 delims=:" %%i in ('dism.exe /get-wiminfo /wimfile:%fid% ^|find "名称"') do (set /a n+=1 &echo   !n! : %%i&set a!n!=%%i)
for /f "tokens=2 delims=:" %%i in ('dism.exe /get-wiminfo /wimfile:%fid% ^|find "Name"') do (set /a n+=1 &echo   !n! : %%i&set a!n!=%%i)
echo.
:mountimageerr4
set index=
set /p index=选择索引序号:
if /i "%index%"=="quit" cls&goto menu
if not defined index  goto mountimageerr4
set /a index=index
if %index% leq 0 goto mountimageerr4
if %index% gtr %n% goto mountimageerr4
set vvid=%vid%\MountTmp%hh%%mm%%ss%
if not exist %vvid% md %vvid%
echo.
echo.%ESC%[92m  %fid% ^=^=^> %vvid%  %ESC%[0m
dism.exe /Mount-Image /ImageFile:%fid% /Index:%index% /MountDir:%vvid%
echo.
echo 挂载结束
echo.
pause&cls&goto menu

:unmount
echo.
set n=
::for %%i in (%vola%) do (if exist %%i:\MountTmp* set /a n+=1 &echo   !n! : %%i:\MountTmp*&set a!n!=%%i:\MountTmp*)
for %%i in (%vola%) do if exist %%i:\MountTmp* for /f %%i in ('dir /b/s %%i:\MountTmp*') do (set /a n+=1 &echo   !n! ^<^=^= %%i&set a!n!=%%i)
if not defined n echo 没找到挂载点! 按任意键继续 .&pause>nul &cls&goto menu
:unmounterr1
echo.
set fid=
set /p fid=选择将要卸载的挂载点:
if /i "%fid%"=="quit" cls&goto menu
if not defined fid  goto unmounterr1
set /a fid=fid
if %fid% leq 0 goto unmounterr1
if %fid% gtr %n% goto unmounterr1
If %fid% leq %n%  set fid=!a%fid%!
echo.
echo.%ESC%[92m  %fid% ^=^=^> ^NUL  %ESC%[0m
echo.
set umid=
set /p umid=%ESC%[31m  是否保存修改: 是(Y) 否(ANY) %ESC%[0m
if not defined umid  set umid=n
if /i %umid%==y dism.exe /unmount-wim /mountdir:%fid% /commit&rd/q %fid%&echo.&echo 卸载结束&echo.&pause&cls&goto menu
dism.exe /unmount-wim /mountdir:%fid% /discard&rd/q %fid%
echo.
echo 卸载结束
echo.
pause&cls&goto menu

:wtoe
echo.
set n=
for %%i in (%vola%) do (if exist %%i: set /a n+=1 &echo   !n! ^=^=^> %%i:)
echo.
:wtoeerr1
set fid=
set /p fid=转换文件存放的驱动器:
if /i "%fid%"=="quit" cls&goto menu  
if not exist %fid%: goto wtoeerr1
for %%i in (%vola%) do (if /i %fid%==%%i set fid=%%i)
set fid=%fid%:
echo.
set n=
cd /d %fid%\ &for /f %%i in ('dir /b /s *.wim,*.esd') do (set /a n+=1 &echo   !n! ^<^=^= %%i&set a!n!=%%i)
echo.
if not defined n goto wtoeerr1
:wtoeerr2
set fid=
set /p fid=选择文件序号:
if /i "%fid%"=="quit" cls&goto menu
if not defined fid  goto wtoeerr2
set /a fid=fid
if %fid% leq 0 goto wtoeerr2
if %fid% gtr %n% goto wtoeerr2
If %fid% leq %n%  set fid=!a%fid%!
echo.
for /f "tokens=2 delims=:" %%i in ('dism.exe /get-wiminfo /wimfile:%fid% ^|find /i "dism.log"') do (
echo.%ESC%[31m  %fid% [文件损坏或格式未知]  %ESC%[0m &echo.&pause&echo. &cls&goto menu)
set n=
for /f "tokens=2 delims=:" %%i in ('dism.exe /get-wiminfo /wimfile:%fid% ^|find "名称"') do (set /a n+=1 &echo   !n! : %%i&set a!n!=%%i)
for /f "tokens=2 delims=:" %%i in ('dism.exe /get-wiminfo /wimfile:%fid% ^|find "Name"') do (set /a n+=1 &echo   !n! : %%i&set a!n!=%%i)   
echo.
:wtoeerr3
set index=
set /p index=选择索引序号:
if /i "%index%"=="quit" cls&goto menu
if not defined index  goto wtoeerr3
set /a index=index
if %index% leq 0 goto wtoeerr3
if %index% gtr %n% goto wtoeerr3
echo.

if  /i %fid:~-3%==wim echo.%ESC%[92m  %fid% ^=^=^>^> %fid:~-0,-3%esd  %ESC%[0m
if  /i %fid:~-3%==wim dism.exe /Export-Image /SourceImageFile:%fid% /SourceIndex:%index% /DestinationImageFile:%fid:~-0,-3%esd /Compress:recovery /CheckIntegrity
if  /i %fid:~-3%==esd echo.%ESC%[92m  %fid% ^=^=^>^> %fid:~-0,-3%wim  %ESC%[0m
if  /i %fid:~-3%==esd  dism.exe /Export-Image /SourceImageFile:%fid% /SourceIndex:%index% /DestinationImageFile:%fid:~-0,-3%wim /Compress:max /CheckIntegrity
echo.
echo 转换结束
echo.
pause&cls&goto menu

:pezip
echo.
set n=
for %%i in (%vola%) do (if exist %%i: set /a n+=1 &echo   !n! ^=^=^> %%i:)
echo.
:peziperr1
set vid=
set /p vid=Boot.wim、PEboot在那个驱动器:
if /i "%vid%"=="quit" cls&goto menu
if not exist %vid%: goto peziperr1
for %%i in (%vola%) do (if /i %vid%==%%i set vid=%%i)
set vid=%vid%:
echo.
set n=
cd /d %vid%\ &for /f %%i in ('dir /b /s boot.wim,PEboot*') do (set /a n+=1 &echo   !n! ^<^=^= %%i&set a!n!=%%i)
echo.
if not defined n echo 没找到Boot.wim、PEboot 按任意键继续 .&pause>nul &echo.&goto peziperr1
echo.
:peziperr2
set fid=
set /p fid=释放文件、打包文件夹:
if /i "%fid%"=="quit" cls&goto menu
if not defined fid  goto peziperr2
set /a fid=fid
if %fid% leq 0 goto peziperr2
if %fid% gtr %n% goto peziperr2
If %fid% leq %n%  set fid=!a%fid%!
if /i %fid:~-3,3%==wim goto uwim
set did=%fid:~-0,-14%%fid:~-8,8%
if not exist %did% md %did%
if exist %did%\boot.wim del %did%\boot.wim  
echo.
echo.%ESC%[92m  %fid% ^=^=^> %did%\boot.wim  %ESC%[0m
echo.
dism.exe /Capture-Image /ImageFile:%did%\boot.wim /CaptureDir:%fid% /Name:WinPE /Compress:max /Bootable /CheckIntegrity /Verify /ScratchDir:%vid%\
echo.
echo 打包结束
echo.
pause&cls&goto menu
:uwim
echo.
for /f "tokens=2 delims=:" %%i in ('dism.exe /get-wiminfo /wimfile:%fid% ^|find /i "dism.log"') do (
echo.%ESC%[31m  %fid% [文件损坏或格式未知]  %ESC%[0m &echo.&pause&echo. &cls&goto menu)
set ffid=%fid:~-0,-8%PEboot%dd%%hh%%mm%%
if not exist %ffid% md %ffid%
echo.
echo.%ESC%[92m  %fid% ^=^=^> %ffid%  %ESC%[0m
echo.
dism.exe /apply-image  /imagefile:%fid% /index:1 /applydir:%ffid%\
echo.
echo 释放结束
echo.
pause&cls&goto menu

:setESC
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set ESC=%%b
  exit /B 0
)
exit /B 0

回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-16 13:25:34 | 显示全部楼层   浙江省嘉兴市
青春的思念 发表于 2023-4-16 11:31
dism.exe /apply-image /imagefile:映像路径 /applydir:C:\ /index:1
直接恢复映像这个也加上吧 我也在写 ...

巧了,我也在开发,已经基本成形了

DISM开发

DISM开发
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-16 13:23:55 | 显示全部楼层   浙江省嘉兴市
本帖最后由 AfanPan 于 2023-4-16 13:26 编辑
AfanPan 发表于 2023-4-16 13:23
延迟确实比较大,因为2次显示直接差了4%的进度

Dismapi每一次显示,差值都是为1%,这样精确一点
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-16 13:23:08 | 显示全部楼层   浙江省嘉兴市
青春的思念 发表于 2023-4-16 13:20
你是等待命令返回完成吧,使用系统_取DOS执行结果() 挂载一个指针可以实时显示的不存在什么延迟大 ...

延迟确实比较大,因为2次显示直接差了4%的进度

点评

要是在乎这点损耗可以直接BAT @echo off mode 75,40 cd /d "%~dp0" setlocal enabledelayedexpansion set vola=C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z set dd=%date:~5,2%%date:~8,2% if %time:~0,2% le   安徽省淮南市  详情 回复 发表于 2023-4-16 13:26
回复 支持 反对

使用道具 举报

结帖率:95% (63/66)

签到天数: 13 天

发表于 2023-4-16 13:20:05 | 显示全部楼层   安徽省淮南市
AfanPan 发表于 2023-4-16 13:11
这东西想调用都简单,但是要操作进度回显延迟问题就大了,调用DISMAPI就没有调用进度显示延迟这东西 ...

你是等待命令返回完成吧,使用系统_取DOS执行结果() 挂载一个指针可以实时显示的不存在什么延迟大
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表