De comandos manuales a scripts dinámicos: Cómo simplifiqué la clonación de Windows en WinPE con DISM
Aquí tienes el artículo formateado en el formato bilingüe solicitado:
De comandos manuales a scripts dinámicos: Cómo simplifiqué la clonación de Windows en WinPE con DISM
从手动命令到动态脚本:我如何使用 DISM 简化 WinPE 中的 Windows 克隆
¿Alguna vez te has encontrado en esa situación donde hay una herramienta que te resuelve un problema pero en tu empresa no está permitida? Ya sea porque usan otra alternativa, por políticas de seguridad o simplemente por decisiones corporativas, te ves obligado a adaptarte. Aunque al principio esto puede parecer frustrante (sobre todo cuando crees que tu herramienta habitual te haría el trabajo más rápido y cómodo), en realidad es una oportunidad de oro. Te obliga a aprender cómo funciona el nuevo entorno y da la excusa perfecta para programar tus propios scripts desde cero para automatizar y simplificar el trabajo diario.
你是否曾遇到过这种情况:有一种工具可以解决你的问题,但在公司却不被允许使用?无论是由于公司采用了其他替代方案、安全策略限制,还是单纯的行政决策,你都不得不做出调整。虽然起初这可能令人沮丧(尤其是当你认为常用的工具能让你工作得更快、更舒适时),但这实际上是一个绝佳的机会。它迫使你深入了解新环境的运作方式,并为你提供了一个完美的借口,让你从零开始编写自己的脚本,从而实现日常工作的自动化和简化。
En mi caso, me enfrenté a la clásica tarea de infraestructura: clonar imágenes de discos y realizar despliegues a partir de preinstalaciones de Windows. En este entorno, la herramienta permitida era DISM, que viene de forma nativa en la suite de Windows y no requiere instalación extra. Si quieres ir directo al grano, puedes consultar y descargar los scripts completos en el repositorio del proyecto en GitHub. Aquí es donde empieza esta historia.
就我而言,我面临着经典的基建任务:克隆磁盘镜像并基于 Windows 预安装进行部署。在这种环境下,允许使用的工具是 DISM,它原生集成在 Windows 套件中,无需额外安装。如果你想直接切入重点,可以在 GitHub 的项目仓库中查看并下载完整的脚本。故事就是从这里开始的。
Despliegue Unificado: Menú Dinámico y Formateo en un solo Script
统一部署:单脚本实现动态菜单与格式化
La primera vez que me tocó hacer un deploy en el trabajo, el punto de partida fue un archivo de texto con una línea de comando extensa que los técnicos copiábamos y pegábamos directamente en la consola de WinPE. Además, debíamos modificar manualmente el nombre de la imagen .wim que queríamos aplicar. Para preparar el disco antes del despliegue, también contábamos con un bloque de instrucciones de diskpart (limpiar volumen, crear tabla GPT, definir particiones EFI y Windows), que estaba almacenado en un archivo de texto independiente.
我第一次在工作中进行部署时,起点是一个包含长命令行文本的文件,技术人员需要将其直接复制并粘贴到 WinPE 控制台中。此外,我们还必须手动修改想要应用的 .wim 镜像名称。为了在部署前准备磁盘,我们还有一段 diskpart 指令块(清理卷、创建 GPT 表、定义 EFI 和 Windows 分区),这些指令存储在一个独立的文本文件中。
Tener comandos dispersos y archivos de configuración sueltos por el disco de herramientas me generaba desconfianza. Si un archivo se borra u otro se desactualiza, el proceso se interrumpe y falla resultando en una pérdida de tiempo en tareas que suelen demorar bastante. Pensé: “Esto tiene que poder hacerse mejor”. La solución fue crear deploy.cmd para concentrar todo el despliegue en un único script autoportante que realiza tres tareas clave de forma secuencial.
命令分散且配置文件散落在工具盘各处,这让我感到很不放心。如果某个文件被误删或过期,流程就会中断并失败,导致在原本就很耗时的任务上浪费更多时间。我想:“这肯定有更好的做法。” 解决方案是创建 deploy.cmd,将整个部署过程集中在一个自包含的脚本中,按顺序执行三个关键任务。
1. Escaneo dinámico y menú interactivo
1. 动态扫描与交互式菜单
Para evitar errores de tipeo al introducir el nombre de la imagen .wim, el script barre el directorio donde se almacenan y las lista en un menú. La decisión de hacerlo así fue para que sea escalable y dinámico permitiendo agregar imágenes al directorio sin necesidad de modificar el script.
为了避免输入 .wim 镜像名称时出现拼写错误,脚本会扫描存储镜像的目录并将其列在菜单中。这样做的目的是为了实现可扩展性和动态性,允许在目录中添加镜像而无需修改脚本。
:: Escaneo dinámico de imágenes
set COUNT=0
for %%A in ("%IMG_DIR%\*.wim") do (
set /a COUNT+=1
set "WIM[!COUNT!]=%%~fA"
set "WIM_NAME[!COUNT!]=%%~nA"
)
:: ... generación del menú interactivo ...
Este simple bucle for detecta los archivos de un directorio y almacena las rutas en “arrays” simulados de Batch, generando opciones numeradas para que solo deba seleccionar una y el script se encargará del resto. Nota de sintaxis: El uso de signos de exclamación (!) en lugar del porcentaje (%) tradicional de Batch se debe a la necesidad de habilitar la expansión retardada (setlocal enabledelayedexpansion). Sin esto, Batch evaluaría las variables del menú al cargar el bucle en memoria y no en tiempo de ejecución, lo que rompería la lógica del índice dinámico.
这个简单的 for 循环会检测目录中的文件,并将路径存储在 Batch 模拟的“数组”中,生成带编号的选项,这样我只需选择一个,脚本就会处理剩下的工作。语法说明:使用感叹号 (!) 而不是传统的百分号 (%) 是因为需要启用延迟变量扩展 (setlocal enabledelayedexpansion)。如果没有它,Batch 会在将循环加载到内存时评估菜单变量,而不是在运行时评估,这会破坏动态索引的逻辑。
2. Integración de DiskPart al vuelo
2. 实时集成 DiskPart
En lugar de depender de un archivo de texto externo para particionar el disco, el propio script genera las instrucciones de diskpart en el directorio temporal y las ejecuta en segundo plano:
脚本不再依赖外部文本文件来对磁盘进行分区,而是直接在临时目录中生成 diskpart 指令并在后台执行:
set "TEMP_SCRIPT=%temp%\dp_script.txt"
(
echo select disk %TARGET_DISK%
echo clean
echo convert gpt
echo create partition efi size=200
echo format quick fs=fat32 label="EFI"
echo assign letter=S
:: ... creación de particiones MSR y Windows ...
) > "%TEMP_SCRIPT%"
diskpart /s "%TEMP_SCRIPT%" >> "%LOG_FILE%" 2>&1
del "%TEMP_SCRIPT%"
Lo ejecutamos silenciosamente con diskpart /s y registramos su salida en un archivo de log (%LOG_FILE%) para diagnosticar posibles fallos.
我们使用 diskpart /s 静默执行它,并将输出记录到日志文件 (%LOG_FILE%) 中,以便诊断可能出现的故障。
3. Configuración automática de arranque UEFI
3. 自动配置 UEFI 引导
Una vez que DISM vuelca la imagen seleccionada, el script ejecuta el paso final para que el sistema sea arrancable de forma automática sin intervención manual:
一旦 DISM 部署完选定的镜像,脚本就会执行最后一步,使系统能够自动引导,无需人工干预:
bcdboot Z:\Windows /s S: /f UEFI >> "%LOG_FILE%" 2>&1
Este comando escribe los archivos de arranque en la partición EFI (S:) apuntando a la instalación de Windows que acabamos de aplicar en la partición primaria (Z:). Al concentrar todo en un único archivo de script, logramos un proceso autocontenido: el mismo archivo prepara el hardware, automatiza la selección de la imagen y configura el arranque UEFI.
该命令将引导文件写入 EFI 分区 (S:),并指向我们刚刚在主分区 (Z:) 上应用的 Windows 安装。通过将所有内容集中在一个脚本文件中,我们实现了一个自包含的流程:同一个文件既准备了硬件,又自动化了镜像选择,还配置了 UEFI 引导。