思路:.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很顺利
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
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,试了下也不行
展开.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\
目录下。
完整的命令如下:
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”的思路,查资料许久,加上多次试错,终于搞定,方案如下
关于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 删除。