batch file - sirven - Cómo detener la secuencia de comandos por lotes en la falla del del
para que sirven los archivos batch (10)
DEL no devuelve un nivel de error si el archivo está bloqueado. Acabo de hacer una prueba con el archivo Excel y vi cero (en Windows XP).
Es posible que sea mejor utilizar IF EXIST para que el archivo se elimine después de realizar la eliminación.
del file.txt
if exist file.txt ECHO "FAIL"
DESPUÉS DE EDITAR Descargo de responsabilidad: no tengo idea de cómo funciona ...
Podrías hacer esto para los archivos
DIR /B /S /A-d > c:/filestodelete.txt
del *.* /S /Q
FOR /F %%i in (c:/filestodelete.txt) DO (
IF EXIST %%i ECHO %%i STILL EXISTS
)
luego para los directorios
DIR /B /S /Ad > c:/directoriestodelete.txt
FOR /D %%G in (*) DO RD /s /q %%G
FOR /F %%i in (c:/directoriestodelete.txt) DO (
IF EXIST %%i ECHO %%i STILL EXISTS
)
Tenemos un script por lotes que elimina archivos ( del
) y directorios ( rd
). ¿Alguien sabe cómo detener (fallar) la ejecución de la secuencia de comandos si falla alguna de estas instrucciones de eliminación? Podrían fallar si un archivo / directorio está bloqueado por Windows. Gracias.
Actualizar
Declaraciones que estoy usando:
Del: del *.* /S /Q
RD: FOR /D %%G in (*) DO RD /s /q %%G
Esta es mi forma preferida de verificar errores mientras borro archivos. Redirigimos el "resultado de error" (archivo estándar "2") a un archivo (por ejemplo, delCmd.err). Luego usamos el comando FOR como una manera de obtener acceso al operador de ~ z "tamaño de archivo". Si el tamaño del archivo de salida no es 0, entonces sabemos que "del" recibió un error ... mostramos el error con el comando "tipo" y salimos del archivo por lotes con un código de error distinto de cero:
del unwanted.txt 2> delCmd.err
FOR /F "usebackq" %%A IN (''delCmd.err'') DO set size=%%~zA
if not "%size%"=="0" (
echo Error deleting unwanted.txt
type delCmd.err
exit /B 1
)
Aquí hay una versión más corta de la variante de monitoreo de resultados. Esto está utilizando 2>&1
truco para redirigir stderr a stdout y for /f
para verificar cualquier salida.
@echo off
setlocal
set error=0
for /f %%i in (''del notepad2.exe 2^>^&1'') do set error=1
echo %error%
Hay un script que funcionará como un hechizo. Prueba el error de eliminación probando la existencia del archivo / directorio supuestamente eliminado.
El resultado será un c: / mydirectorio existente con contenido completamente vacío. Cualquier error rompe el proceso y se informa.
El único inconveniente es que los directorios se eliminan recursivamente, porque no hay una manera simple de comenzar a eliminar directorios comenzando con la mayoría de los directorios "secundarios".
@echo OFF
set path_to_clean=c:/mydirectory
@echo -Deleting Files
dir /A-D /S /B %path_to_clean%/* > fileslist.txt
for /F %%F in (fileslist.txt) do (
@echo Deleting %%F
del %%F 2> nul
if exist %%F (
@echo Cannot delete %%F, it is locked.
goto errorhandling
)
)
del fileslist.txt
@echo -Deleting Files done
@echo -Deleting Directories
dir /AD /B %path_to_clean%/* > directorieslist.txt
for /F %%D in (directorieslist.txt) do (
@echo Deleting %path_to_clean%/%%D
rmdir /S /Q %path_to_clean%/%%D 2> nul
if exist %path_to_clean%/%%D (
@echo Cannot delete %path_to_clean%/%%D. This folder or one of its sub-directories is locked.
goto errorhandling
)
)
del directorieslist.txt
@echo -Deleting Directories done
:errorhandling
rem some code here
Hola, esto también debería funcionar
@echo off
for /f %%i in (''del notepad2.exe 2^>^&1'') do set ERRORLEVEL=1
IF %ERRORLEVEL%=1 then exit
Para eliminar los archivos, primero puede intentar ren
(renombrar) el archivo. ren
configurará ERRORLEVEL en 1 si el archivo está bloqueado. Agrega citas alrededor del nombre del archivo.
@echo OFF
:: Delete all files, but exit if a file is locked.
for %%F in (*.*) do (
@echo Deleting %%F
ren "%%F" tmp 2> nul
if ERRORLEVEL 1 (
@echo Cannot delete %%F, it is locked.
exit /b 1
)
del tmp
)
Sospecho que puede hacer lo mismo para los directorios, pero parece que no puedo encontrar la forma de bloquear un directorio para poder hacer la prueba. Lo siguiente puede funcionar:
:: Remove all directories, but exit if one is locked.
FOR /D %%G in (*) DO (
@echo Removing %%G
ren "%%G" tmpdir 2> nul
if ERRORLEVEL 1 (
@echo Cannot remove %%G, it is locked
exit /b 1
)
RD /s /q tmpdir
)
EDITAR: Correcto, entonces del
no configura el ERRORLEVEL
correctamente. Vea ERRORLEVEL en DEL y el comando de eliminación de Windows puede fallar silenciosamente
SOLUCIÓN ANTERIOR (incorrecta)
Debería verificar el nivel de errorlevel
.
Por ejemplo:
del file.txt
if errorlevel 1 goto FAIL
:PASS
echo Worked!
goto :END
:FAIL
echo Failed!
exit /B 1
:END
Estos parecen funcionar para mí:
RD:
FOR /D %d IN (*) DO ( RD /S /Q "%d" & IF EXIST "%d" EXIT /B 1 )
DEL:
FOR %f IN (*.*) DO ( DEL /Q "%f" & IF EXIST "%f" EXIT /B 1 )
Sin embargo, no tengo idea del rendimiento.
Puede agregar bandera / F a DEL para un modo de "eliminación de fuerza".
Solo para tu información. El comando DEL devuelve un código de error si ocurre un error grave, sin embargo, su comportamiento va más allá de nuestra intuición de que las personas simplemente creerían que el código de error no funciona en absoluto.
Esto es lo que he probado en el comando DEL en Windows 7:
- Eliminación exitosa de todos los archivos: 0 (por supuesto)
- Algunos archivos eliminados, algunos archivos faltantes: 0 (la intuición espera 1)
- Fallo de eliminación debido a la falta de permiso o a un medio de solo lectura: 0 (la intuición espera ≥ 1)
- Unidad o unidad no existente no lista (como sin CD en una unidad de CD-ROM): 1 (sí, la obtiene, pero esperaré un código de error más alto)
- Ruta no válida: 1 (también esperaré un código de error más alto)
Y, si especifica una lista de archivos para el comando DEL, donde al menos uno de los archivos se ajusta a los dos últimos tipos de error mencionados anteriormente, ninguno de los archivos de la lista se eliminará .
Para rd
y rmdir
puedes hacer
rd "some directory" || rem
esto establecerá el nivel de error correctamente - ver