varios sirven script que programacion por para lotes los ejemplos ejecutar crear como comandos comando codigos batch bat archivos archivo batch-file dos

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 )



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