HOWTO · Batch
Extraer o descomprimir archivo en secuencia de Batch comandos
Este tutorial verá cómo podemos extraer o descomprimir archivos en Batch Script.
En esta página
Para extraer un archivo ZIP desde un archivo por lotes de Windows, indica las rutas del archivo y del destino y, después, llama a un extractor de línea de comandos. tar de Windows es una opción integrada en las versiones compatibles de Windows 10 y posteriores; 7-Zip es una alternativa que debes instalar. Esta guía muestra los comandos, explica un método con Windows Shell y VBScript y describe cómo procesar varios archivos de forma segura. Los ejemplos de comandos son específicos de Windows y se presentan como sintaxis; no se han ejecutado en este paquete.
Extraer un archivo ZIP con tar de Windows
En las versiones compatibles de Windows 10 y posteriores, tar puede extraer archivos ZIP sin instalar otra herramienta. Microsoft documenta el comando tar de Windows y su disponibilidad aquí. En este ejemplo de archivo por lotes, zipFile es C:\Work\sample.zip y outputDir es C:\Work\sample-extracted; sustituye ambas rutas de ejemplo por las tuyas. El script crea el destino si hace falta y, a continuación, ejecuta tar -xf "%zipFile%" -C "%outputDir%".
La opción -x extrae el contenido, -f indica el archivo y -C selecciona el directorio en el que aparecerá su contenido. El directorio de destino se crea primero si hace falta. Las comillas alrededor de las variables mantienen juntas las rutas que contienen espacios como un único argumento. Este ejemplo es para archivos ZIP; no des por hecho que tar está disponible en instalaciones antiguas de Windows ni que este comando sea adecuado para todos los formatos de archivo.
Guarda esto como un archivo .bat y ejecútalo en una instalación compatible de Windows:
@echo off
setlocal
set "zipFile=C:\Work\sample.zip"
set "outputDir=C:\Work\sample-extracted"
if not exist "%zipFile%" (
echo ZIP archive not found: "%zipFile%"
exit /b 1
)
if not exist "%outputDir%" (
mkdir "%outputDir%"
if errorlevel 1 (
echo Could not create destination: "%outputDir%"
exit /b 1
)
)
tar -xf "%zipFile%" -C "%outputDir%"
exit /b %errorlevel%
Para ver de forma portátil el resultado de la extracción con la biblioteca estándar de Python, ejecuta este ejemplo autónomo. Crea un archivo ZIP pequeño en un directorio temporal, lo extrae y comprueba el archivo extraído sin depender de un archivo externo ni de una ruta fija:
from pathlib import Path
from tempfile import TemporaryDirectory
from zipfile import ZipFile
with TemporaryDirectory() as temp_dir:
root = Path(temp_dir)
archive = root / "sample.zip"
destination = root / "extracted"
destination.mkdir()
with ZipFile(archive, "w") as zip_file:
zip_file.writestr("notes/readme.txt", "Batch extraction demo")
with ZipFile(archive) as zip_file:
zip_file.extractall(destination)
assert (destination / "notes" / "readme.txt").read_text() == "Batch extraction demo"
El ejemplo de Python muestra la relación entre el archivo de origen y el directorio de destino; no es un comando de Windows por lotes ni permite determinar qué versiones de Windows incluyen tar. El comando tar de Windows anterior no se ha ejecutado aquí. Cuando se ejecute correctamente, el contenido del archivo aparecerá en el directorio indicado por outputDir.
Extraer un archivo ZIP con 7-Zip
Usa 7-Zip si ya está instalado o si necesitas que admita formatos además de ZIP. En este ejemplo de archivo por lotes, sevenZipPath apunta a C:\Program Files\7-Zip\7z.exe, zipFile a C:\Work\sample.zip y outputDir a C:\Work\sample-extracted; cambia estas rutas para que coincidan con tu instalación y tus archivos. La documentación oficial de la línea de comandos de 7-Zip describe sus comandos y opciones. El script crea el destino si hace falta y, a continuación, ejecuta "%sevenZipPath%" x "%zipFile%" -o"%outputDir%".
El comando x extrae el contenido y conserva la estructura de directorios del archivo; -o indica el destino y debe permanecer unido a la ruta, como se muestra. Instala 7-Zip primero o cambia sevenZipPath para que coincida con su ubicación. Los archivos extraídos aparecerán en outputDir. Guarda esto como un archivo .bat. Este ejemplo de comando de Windows no se ha ejecutado aquí; si otros pasos del archivo por lotes dependen de que la extracción haya terminado, comprueba el código de salida del comando y ten en cuenta que el archivo podría haber escrito algunos archivos antes de informar de un error.
@echo off
setlocal
set "sevenZipPath=C:\Program Files\7-Zip\7z.exe"
set "zipFile=C:\Work\sample.zip"
set "outputDir=C:\Work\sample-extracted"
if not exist "%sevenZipPath%" (
echo 7-Zip executable not found: "%sevenZipPath%"
exit /b 1
)
if not exist "%zipFile%" (
echo ZIP archive not found: "%zipFile%"
exit /b 1
)
if not exist "%outputDir%" (
mkdir "%outputDir%"
if errorlevel 1 (
echo Could not create destination: "%outputDir%"
exit /b 1
)
)
"%sevenZipPath%" x "%zipFile%" -o"%outputDir%"
exit /b %errorlevel%
Usar Windows Shell y VBScript desde un archivo por lotes
Un archivo por lotes de Windows puede llamar a Windows Script Host para usar el objeto de automatización Shell. Microsoft documenta el método Shell Folder.CopyHere aquí. El siguiente ejemplo .bat escribe un archivo VBScript temporal completo, pasa primero el directorio de destino y después el archivo ZIP de origen, y elimina el archivo temporal cuando cscript termina. Las rutas de ejemplo son C:\Work\sample.zip y C:\Work\sample-extracted; sustitúyelas antes de ejecutar el script. Este comprueba si Windows Shell puede abrir cada espacio de nombres e indica qué ruta no está disponible.
@echo off
setlocal
set "zipFile=C:\Work\sample.zip"
set "outputDir=C:\Work\sample-extracted"
set "scriptFile=%TEMP%\extract-zip-%RANDOM%.vbs"
if not exist "%zipFile%" (
echo ZIP archive not found: "%zipFile%"
exit /b 1
)
if not exist "%outputDir%" (
mkdir "%outputDir%"
if errorlevel 1 (
echo Could not create destination: "%outputDir%"
exit /b 1
)
)
> "%scriptFile%" (
echo Dim shell, destination, source
echo Set shell = CreateObject^("Shell.Application"^)
echo Set destination = shell.NameSpace^(WScript.Arguments^(0^)^)
echo If destination Is Nothing Then
echo WScript.Echo "Destination folder is unavailable: " ^& WScript.Arguments^(0^)
echo WScript.Quit 2
echo End If
echo Set source = shell.NameSpace^(WScript.Arguments^(1^)^)
echo If source Is Nothing Then
echo WScript.Echo "ZIP archive namespace is unavailable: " ^& WScript.Arguments^(1^)
echo WScript.Quit 3
echo End If
echo destination.CopyHere source.Items
)
if errorlevel 1 (
echo Could not write temporary VBScript: "%scriptFile%"
exit /b 1
)
cscript //nologo "%scriptFile%" "%outputDir%" "%zipFile%"
set "scriptStatus=%errorlevel%"
del "%scriptFile%" >nul 2>&1
if not "%scriptStatus%"=="0" (
echo Windows Script Host returned status %scriptStatus%.
exit /b %scriptStatus%
)
echo CopyHere was requested; check the destination separately before using extracted files.
exit /b 0
Este método depende de Windows Script Host y de la gestión de archivos ZIP de Shell. En el VBScript temporal, el argumento 0 es la carpeta de destino y el argumento 1 es el archivo ZIP de origen. CopyHere puede regresar antes de que termine la copia, por lo que una respuesta correcta de cscript no demuestra que la extracción haya finalizado. El mensaje del archivo por lotes solo confirma que regresó la solicitud de copia; si los comandos siguientes van a mover, eliminar o leer los archivos extraídos, añade una comprobación independiente de finalización adecuada para el archivo y el destino. Este método específico de Windows se presenta como un ejemplo no ejecutado.
Automatizar la extracción de varios archivos ZIP
Recorre los archivos ZIP del directorio de origen y asigna a cada archivo su propio directorio de destino. Usar destinos separados evita que archivos con el mismo nombre de distintos archivos se sobrescriban entre sí. Este archivo por lotes establece rutas de ejemplo, comprueba el directorio de origen, crea el directorio raíz de salida e informa de los errores al crear directorios o extraer archivos. Termina con el estado 1 si falla algún archivo o si no encuentra archivos ZIP.
@echo off
setlocal
set "sourceDir=C:\Work\incoming"
set "outputRoot=C:\Work\extracted"
set "found=0"
set "failed=0"
if not exist "%sourceDir%\" (
echo Source directory not found: "%sourceDir%"
exit /b 1
)
if not exist "%outputRoot%\" (
mkdir "%outputRoot%"
if errorlevel 1 (
echo Could not create output root: "%outputRoot%"
exit /b 1
)
)
for %%F in ("%sourceDir%\*.zip") do if exist "%%~fF" call :extract "%%~fF" "%%~nF"
if "%found%"=="0" (
echo No ZIP files found in: "%sourceDir%"
exit /b 1
)
if "%failed%"=="1" exit /b 1
echo All ZIP files were extracted successfully.
exit /b 0
:extract
set "found=1"
set "destination=%outputRoot%\%~2"
if not exist "%destination%\" (
mkdir "%destination%"
if errorlevel 1 (
echo Could not create destination for "%~1": "%destination%"
set "failed=1"
exit /b 0
)
)
tar -xf "%~1" -C "%destination%"
if errorlevel 1 (
echo Extraction failed for: "%~1"
set "failed=1"
) else (
echo Extracted "%~1" to "%destination%"
)
exit /b 0
Aquí, %%~fF se expande a la ruta completa del archivo actual y %%~nF a su nombre sin la extensión .zip. Cada archivo se extrae en un subdirectorio con el nombre correspondiente, dentro de outputRoot. Si falta el directorio de origen o no se puede crear el directorio raíz de salida, el script se detiene de inmediato con un estado distinto de cero. Si falla el destino de un archivo o tar, se muestra la ruta afectada, se marca la ejecución por lotes como fallida y se intenta procesar los archivos restantes; el estado final será distinto de cero si se produjo alguno de esos errores. Si no coincide ningún archivo ZIP, el script muestra un mensaje y termina con un estado distinto de cero. En una ventana interactiva del Símbolo del sistema, usa %F en lugar de %%F; los signos de porcentaje duplicados se usan en un archivo por lotes. Este ejemplo de comando tar es específico de Windows y no se ha ejecutado aquí.
Solucionar problemas al extraer archivos ZIP con un archivo por lotes
- No se encuentra el comando: Comprueba que
taresté disponible en esa instalación de Windows. Para 7-Zip, confirma quesevenZipPathapunte a7z.exey que 7-Zip esté instalado. En versiones antiguas de Windows que no incluyen eltarnecesario, usa un extractor instalado, como 7-Zip. - Una ruta con espacios se divide: Pon entre comillas las rutas del archivo y del destino, como en los ejemplos. Con 7-Zip, al poner entre comillas la ruta de destino, conserva el prefijo
-ojusto delante de ella, por ejemplo:-o"C:\Work Files\Extracted". - No se puede abrir o crear el destino: Asegúrate de que exista el directorio principal y de que tu cuenta tenga permiso para escribir allí. Crea el destino antes de extraer y elige una carpeta, no una ruta de archivo.
- Faltan archivos o la extracción parece incompleta: Confirma que la ruta de origen indique el archivo ZIP correcto, que sea un archivo ZIP y que pueda abrirse. Comprueba el código de salida del extractor. Con el método Shell/VBScript
CopyHere, espera a que finalice la operación de forma asíncrona antes de usar los archivos extraídos. - Varios archivos contienen archivos con el mismo nombre: Extrae cada archivo en un directorio independiente, como en el patrón de bucle, en lugar de enviar todo el contenido a un destino compartido.
- El comando se comporta de otra manera en otro shell: Estos ejemplos de sintaxis para archivos por lotes están dirigidos al Símbolo del sistema de Windows (CMD). No son sintaxis de Bash ni de PowerShell, así que no los pegues sin cambios en esos shells.