前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >把.esd转化为.cab,我终于知道报"错误: 11 试图加载格式不正确的程序"的原因了

把.esd转化为.cab,我终于知道报"错误: 11 试图加载格式不正确的程序"的原因了

原创
作者头像
Windows技术交流
修改2024-04-22 14:40:15
1780
修改2024-04-22 14:40:15
举报
文章被收录于专栏:Windows技术交流Windows技术交流

思路:.esd→ .wim→ .cab

注意:A single CAB file can be used to store a maximum of 65,535 files with a total size of up to 1.99 GiB.

背景:有个没网的英文版Windows系统想安装中文语言包

方案:用同镜像买台有公网的新机器安装中文语言包,然后在softwaredistribution目录(C:\Windows\SoftwareDistribution\Download\xxx子目录)中找.cab文件或.esd文件,这种是最新的语言包

把它拷贝到我本地G:\Microsoft-Windows-Server-LanguagePack-Package_zh-cn~31bf3856ad364e35~amd64~zh-cn~.esd

执行这句powershell转为.wim很顺利

代码语言:powershell
复制
dism /export-image /SourceImageFile:G:\Microsoft-Windows-Server-LanguagePack-Package_zh-cn~31bf3856ad364e35~amd64~zh-cn~.esd /SourceIndex:1 /DestinationImageFile:G:\LP.wim /Compress:max /CheckIntegrity

但是.wim转.cab时报错了

换思路:把.esd展开到一个临时文件夹,然后尝试对整个文件夹的所有内容压缩为.cab

代码语言:powershell
复制
mkdir -force G:\Temp\mount
mkdir -force G:\Temp\extract
Expand-WindowsImage -ImagePath "G:\Microsoft-Windows-Server-LanguagePack-Package_zh-cn~31bf3856ad364e35~amd64~zh-cn~.esd" -Index 1 -ApplyPath "G:\Temp\extract"

github上找了个第三方工具CabMaker,试了下也不行

代码语言:txt
复制
展开.esd跟挂载.wim到临时目录是一样的,都是为了查看其中的文件(其实用7z就能查看)
如果是挂载.wim的方式,挂载查看完了,别忘记解挂载
Dism /Mount-Wim /WimFile:G:\LP.wim /Index:1 /MountDir:G:\Temp\mount
Dism /Unmount-Image /MountDir:"G:\Temp\mount" /Discard

最后又回去研究报"错误: 11 试图加载格式不正确的程序"的问题

发现原来如此简单

这句报错:

Dism.exe /Export-Image /SourceImageFile:"G:\LP.wim" /SourceIndex:1 /DestinationImageFile:"G:\Microsoft-Windows-Server-Language-Pack_x64_zh-cn.cab" /Compress:max

换个目标路径不报错:

Dism.exe /Export-Image /SourceImageFile:"G:\LP.wim" /SourceIndex:1 /DestinationImageFile:"G:\Temp\Microsoft-Windows-Server-Language-Pack_x64_zh-cn.cab" /Compress:max

报错原因是源和目标路径的文件夹不能一样,G:\src_file.ext和G:\des_file.ext的文件夹都是G:\,所以报错。

在使用 dism /Export-Image 命令进行文件转换时,源文件和目标文件不能在同一个文件夹中。这是因为在转换过程中,如果源文件和目标文件位于同一目录,可能会出现文件冲突,导致转换失败。

因此,当在执行这个命令时,确保源文件和目标文件位于不同的目录下。例如,源文件在 G:\ 目录下,而目标文件在 G:\Temp\ 目录下。

完整的命令如下:

代码语言:powershell
复制
mkdir -force G:\Temp\mount
mkdir -force G:\Temp\extract
dism /Get-WimInfo /WimFile:G:\Microsoft-Windows-Server-LanguagePack-Package_zh-cn~31bf3856ad364e35~amd64~zh-cn~.esd
#查询序号为1
del G:\LP.wim 2>$nul
dism /export-image /SourceImageFile:G:\Microsoft-Windows-Server-LanguagePack-Package_zh-cn~31bf3856ad364e35~amd64~zh-cn~.esd /SourceIndex:1 /DestinationImageFile:G:\LP.wim /Compress:max /CheckIntegrity
dism /Get-WimInfo /WimFile:G:\LP.wim
#注意源和目标路径不能相同,否则会报错误: 11 试图加载格式不正确的程序。
#G:\src_file.ext和G:\des_file.ext的文件夹都是G:\,所以报错
#Dism.exe /Export-Image /SourceImageFile:"G:\LP.wim" /SourceIndex:1 /DestinationImageFile:"G:\Microsoft-Windows-Server-Language-Pack_x64_zh-cn.cab" /Compress:max
#正确的做法是,目标文件换个路径即可
Dism.exe /Export-Image /SourceImageFile:"G:\LP.wim" /SourceIndex:1 /DestinationImageFile:"G:\Temp\Microsoft-Windows-Server-Language-Pack_x64_zh-cn.cab" /Compress:max

真是一波三折

虽然上面办法转化得到了.cab格式的文件,并且用7z打开能看到一样的目录结构

但是我发现个问题,虽然Dism.exe /Export-Image /SourceImageFile:"G:\LP.wim" /SourceIndex:1 /DestinationImageFile:"G:\Temp\Microsoft-Windows-Server-Language-Pack_x64_zh-cn.cab" /Compress:max /CheckIntegrity转化.cab成功了,但是用explorer双击打不开这个.cab(去除压缩解压缩软件的关联,否则会被这些软件打开,最好显性在打开方式里选资源管理器,即explorer去打开看看),而微软语言包ISO中的Microsoft-Windows-Server-Language-Pack_x64_zh-cn.cab可以用explorer双击打开,事实证明这种办法真的不行,因为用dism命令应用这个文件的时候报错了

为了得到能用explorer打开的.cab,于是我又回到“把.esd展开到一个临时文件夹,然后尝试对整个文件夹的所有内容压缩为.cab”的思路,查资料许久,加上多次试错,终于搞定,方案如下

代码语言:txt
复制
关于cabarc的用法参考微软官网文档
https://learn.microsoft.com/zh-tw/previous-versions/bb417343(v=msdn.10)

添加环境变量(应该是安装vs2022后产生的,这个路径里正好有cabarc.exe)
"C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Extensions\Microsoft\Windows Azure Tools\WADPlugin\Monitor\x64"

接下来是cmd命令行

cd /d "G:\Temp\extract"
cabarc -m lzx:21 -r -p n G:\test1.cab *
这个参数获得的.cab有目录结构

cd /d "G:\Temp\extract1"
cabarc -m lzx:21 -r n G:\test2.cab *
这个参数获得的.cab没有目录结构

有没有目录结构差异在有没有-p

请注意:cabarc -m lzx:21 -r -p n这个固定写法不要改变大小写,否则可能会报错无法识别命令

虽然最终通过cabarc转化获得了有目录结构且用explorer双击能打开的.cab,但是这个.cab在使用lpksetup命令安装时,识别不到,好在用dism命令能安装上

用explorer打开.cab意思如下图:

把转化后的.cab语言包放到桌面,用dism安装.cab语言包

dism /online /add-package /packagepath:C:\Users\Administrator\Desktop\Microsoft-Windows-Server-Language-Pack_x64_zh-cn.cab

然后重启机器运行ms-settings:regionlanguage设置中文为界面语言

综上,如果有现成的微软大语言包,还是直接找大语言包吧,如果能在softwaredistribution目录(C:\Windows\SoftwareDistribution\Download\xxx子目录)中找到Microsoft-Windows-Server-Language-Pack_x64_zh-cn.cab,能找到固然好,找不到,只有.esd的话,那就想办法找大语言包吧,毕竟搞一套vs2022环境还是挺麻烦的,如果你有现成的当然好,顺手添加个环境变量转化一下然后用dism命令集成即可。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档