dd: 修复部分镜像系统文件大小写不同导致报错

This commit is contained in:
bin456789 2025-04-21 21:32:01 +08:00
parent 5409cecbcb
commit f4e497883f
No known key found for this signature in database
GPG Key ID: EE301B386DE6C11B
2 changed files with 52 additions and 22 deletions

View File

@ -2843,9 +2843,9 @@ modify_windows() {
if $use_gpo; then if $use_gpo; then
# 使用组策略 # 使用组策略
gpt_ini=$os_dir/Windows/System32/GroupPolicy/gpt.ini scripts_ini=$(get_path_in_correct_case $os_dir/Windows/System32/GroupPolicy/Machine/Scripts/scripts.ini)
scripts_ini=$os_dir/Windows/System32/GroupPolicy/Machine/Scripts/scripts.ini
mkdir -p "$(dirname $scripts_ini)" mkdir -p "$(dirname $scripts_ini)"
gpt_ini=$(get_path_in_correct_case $os_dir/Windows/System32/GroupPolicy/gpt.ini)
# 备份 ini # 备份 ini
for file in $gpt_ini $scripts_ini; do for file in $gpt_ini $scripts_ini; do
@ -2892,7 +2892,7 @@ EOF
download $confhome/windows-del-gpo.bat $os_dir/windows-del-gpo.bat download $confhome/windows-del-gpo.bat $os_dir/windows-del-gpo.bat
else else
# 使用 SetupComplete # 使用 SetupComplete
setup_complete=$os_dir/Windows/Setup/Scripts/SetupComplete.cmd setup_complete=$(get_path_in_correct_case $os_dir/Windows/Setup/Scripts/SetupComplete.cmd)
mkdir -p "$(dirname $setup_complete)" mkdir -p "$(dirname $setup_complete)"
# 添加到 C:\Setup\Scripts\SetupComplete.cmd 最前面 # 添加到 C:\Setup\Scripts\SetupComplete.cmd 最前面

View File

@ -115,6 +115,9 @@ list_files_from_inf() {
# [Intel.NTamd64.6.0] # [Intel.NTamd64.6.0]
# ; Empty section. # ; Empty section.
# 如果后期改成不从 Manufacturer 获取支持的架构,而是从[]获取支持的架构,注意这种情况
# [Intel.NTamd64.10.0.1..22000]
############################################## ##############################################
# 例子1 # 例子1
@ -206,8 +209,7 @@ list_files_from_inf() {
dir=$(echo "$line" | awk -F, '{print $4}' | simply_inf_word) dir=$(echo "$line" | awk -F, '{print $4}' | simply_inf_word)
# 每行一条记录 # 每行一条记录
if [ -n "$SourceDisksNames" ]; then if [ -n "$SourceDisksNames" ]; then
SourceDisksNames="$SourceDisksNames SourceDisksNames=$SourceDisksNames$'\n'
"
fi fi
SourceDisksNames="$SourceDisksNames$num:$dir" SourceDisksNames="$SourceDisksNames$num:$dir"
fi fi
@ -237,7 +239,11 @@ list_files_from_inf() {
done < <(echo "$inf_txts") done < <(echo "$inf_txts")
} }
find_file_ignore_case() { # windows 安装驱动时,只会安装相同架构的驱动文件到系统,即使 inf 里有列出其它架构的驱动
# 因此 DISM 导出驱动时,也就没有包含其它架构的驱动文件
# 用于尽可能匹配路径大小写
get_path_in_correct_case() {
# 同时支持参数和管道 # 同时支持参数和管道
local path local path
path=$({ if [ -n "$1" ]; then echo "$1"; else cat; fi; }) path=$({ if [ -n "$1" ]; then echo "$1"; else cat; fi; })
@ -247,40 +253,64 @@ find_file_ignore_case() {
# shellcheck disable=SC2046 # shellcheck disable=SC2046
set -- $(echo "$path" | grep -o '[^/]*') set -- $(echo "$path" | grep -o '[^/]*')
( (
# windows 安装驱动时,只会安装相同架构的驱动文件到系统,即使 inf 里有列出其它架构的驱动
# 因此导出驱动时,也就不会包含其它架构的驱动文件
# 因此这里只警告,不中断脚本
local output= local output=
if is_absolute_path "$path"; then if is_absolute_path "$path"; then
cd / cd /
output=/ output=/
fi fi
stop_find=false
while [ $# -gt 0 ]; do while [ $# -gt 0 ]; do
local part=$1 local part=$1
local tmp
# shellcheck disable=SC2010 # shellcheck disable=SC2010
if part=$(ls -1 | grep -Fix "$part"); then if ! $stop_find; then
if tmp=$(ls -1 | grep -Fix "$part"); then
part=$tmp
# 大于 1 表示当前 part 是目录 # 大于 1 表示当前 part 是目录
if [ $# -gt 1 ]; then if [ $# -gt 1 ]; then
if cd "$part"; then if ! cd "$part" 2>/dev/null; then
output="$output$part/"
else
warn "Can't cd $path" warn "Can't cd $path"
return 1 stop_find=true
fi fi
fi
else
stop_find=true
fi
fi
if [ $# -gt 1 ]; then
output="$output$part/"
else else
# 最后 part # 最后 part
output="$output$part" output="$output$part"
fi fi
shift
done
echo "$output"
)
}
is_file_or_link() {
# -e / -f 坏软连接,返回 false
# -L 坏软连接,返回 true
[ -f "$1" ] || [ -L "$1" ]
}
find_file_ignore_case() {
# 同时支持参数和管道
local path
path=$({ if [ -n "$1" ]; then echo "$1"; else cat; fi; })
path=$(get_path_in_correct_case "$path")
if is_file_or_link "$path"; then
echo "$path"
else else
warn "Can't find $path" >&2 warn "Can't find $path" >&2
return 1 return 1
fi fi
shift
done
echo "$output"
)
} }
parse_inf_and_cp_driever() { parse_inf_and_cp_driever() {