Pregunta

i tiene el código siguiente en el lote (cmd):

for /f "delims=" %%f in ('dir /b /s Example') do (
command
if %errorlevel%==1 (
command
SKIP
)
command
)

EDIT: Para hacer las cosas más claras: for /f... búsquedas para un directorio llamado 'Ejemplo' y bucles para buscar más directorios de una forma. la primera command es un comando de eliminación, que elimina todos los archivos en el directorio. la command que ocurre cuando se produce un error, es un comando echo que escribe algo de información sobre el error en un archivo de texto. Ahora la cosa agujero skip; A veces, los archivos no se pueden eliminar debido a access denied o this file is in use by.... Normalmente, lo que sucedería si no hubiera una cosa de salto, que acaba de parar el comando y colgar. Por lo tanto, lo que quiero hacer, es evitar que esto suceda. Por otra parte, quiero usar algo como skip, por lo que puede omitir el archivo y continuar de todos modos. Así que creo que necesita este comando para pasar por un tubo en el comando delete.

Espero que sea claro ahora.

Gracias de antemano.

¿Fue útil?

Solución

¿Así?

for /f "delims=" %%f in ('dir /b /s Example') do (
  command
  if not errorlevel 1 (
    command-for-success
  ) else (
    command-for-error
  )
)

Otros consejos

Cree los dos archivos de comandos y ejecutar delex.cmd. Los archivos y directorios que no se eliminan se registrarán en delex.txt. Los que cuelgue, tendrán una abierta ventana minimizada cmd que es asesinado después de un retraso mediante el uso de ping (gracias a la sugerencia de Doc Brown).

delex2.cmd
----------
@echo off
del /q %1 
if exist %1 echo %1 not deleted!>>delex.txt 
exit 

delex.cmd
---------
@echo off
if exist delex.txt del delex.txt 
for /f "delims=" %%f in ('dir /s /b example') do start "delextaskkill" /min delex2.cmd "%%f"
ping 127.0.0.1 -n 3 -w 1000> nul
taskkill /fi "Windowtitle eq delextaskkill"> nul

Probado con:

\example
|   file1
|   file2
|   file3
|   file4
|   file5
|
\---example
        file1
        file2
        file3
        file4
        file5

Cuando se utiliza del, y "acceso denegado" o "este archivo está en uso por ..." ocurre, %errorlevel% es 0, lo que las pruebas %errolevel% es inútil. Tal vez la siguiente solución sencilla funciona en su caso:

for /f "delims=" %%f in ('dir /b /s Example') do (
    del %%f
    if exist %%f (
         echo "file not deleted"
    ) else (
         echo "file deleted"
    )
 ) 

Creo que esto es lo que quiere

for /f "delims=" %%f in ('dir /b /s Example') do (
  command
  if not errorlevel 1 (
    command
  ) else (
    command
    goto :eof
  )
)

Tal vez esto es más avanzado que se puede lograr mediante el procesamiento cmd simplemente incorporado. ¿Por qué no considerar el uso de Windows Scripting Host (VBScript / JScript) o incluso PowerShell? Tanto es probable que le proporcionará el nivel de control que está solicitando.

Trate de este archivo por lotes:

@echo off
REM For each directory named 'Example' ...
for /f "delims=" %%f in ('dir /b /s Example') do (
    REM .. enter the directory and delete all the files found there.
    pushd .
    cd %%f
    del /q *
    for /f "delims=" %%z in ('dir /b') do (
        REM Any files that still exist must have been inaccessable.  Log an error.
        echo Unable to delete file %%z > C:\logfile.txt
    )
    popd
)

Probado con la siguiente estructura de directorios:

folder\
|------Example\
|      |-------file1 (write-protected)
|      |-------file2
|      |-------file3
|------deeper\
       |-------Example\
               |-------file4
               |-------file5 (write-protected)
               |-------file6

Después de ejecutar el archivo por lotes, sólo quedaban file1 y file5. Un mensaje de "acceso denegado" fue impreso para cada archivo protegido contra encontrado; si eso te molesta que vuelva a dirigir la salida del archivo por lotes como script.bat > NUL de ocultarlo.

Así que después de todas las respuestas existentes no le satisface y que necesita absolutamente un salto dentro de su archivo por lotes, voy a hacer otro intento:

@echo off
setlocal

for /f "delims=" %%f in ('dir /b /s batch') do call :DoSomething %%f
goto end

:DoSomething
echo Here i am: %1
if %errorlevel%==1 goto :eof

echo No error occured
goto :eof

:end
endlocal

El truco es, que el bucle for llama a una función secundaria dentro del mismo archivo y da el parámetro necesario para ello. Esta nueva llamada se ejecuta en un nuevo contexto y sólo se puede acceder a las variables que se definen después de la do call :DoSomething en el orden dado su.

Así que hay que acceder a las variables de aquí con %1, %2, etc. Si quieres dejar este contexto hay que hacer una goto :eof para saltar al final del archivo (este marcador está predefinida en el modo por lotes y no debe ocurrir dentro de su archivo), lo que deja el contexto y vuelve al bucle.

Después de ejecutar a través de todo el bucle que acaba de saltar al marcador :end, hacer un poco de la limpieza y se terminó.

Los siguientes busca las extensiones de archivo que desea de forma recursiva en el marco del "nombredir" árbol de directorios y ejecuta commandstuff.bat contra ese nombre de archivo:

  

para / r% i en (c:. \ Dirname \ * ext) hacer   commandstuff "% i"

Commandstuff.bat es similar al siguiente:

  

@ECHO OFF
del 1%
SI (% ERRORLEVEL% ==   0) Goto FIN   
  : ERROR
Echo error al eliminar% 1 |   
  : FIN
final Eco

Esto iría en commandstuff.bat para que borre los archivos que desea. Cuando hay un error que simplemente eco de los detalles del archivo y continuar procesando el archivo siguiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top