Domanda

Ho il seguente codice nel batch (cmd):

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

Modifica Per rendere le cose più chiare: Ricerche for /f... per una directory chiamata 'Esempio' e loop per la ricerca di più directory di un modo. il primo command è un comando di cancellazione, cancella tutti i file nella directory. la command che si verifica quando si verifica un errore, è un comando echo che scrive alcune informazioni sull'errore in un file di testo. ora la cosa buco skip; a volte, i file non possono essere cancellati a causa di access denied o this file is in use by.... Normalmente, cosa sarebbe successo se non ci fosse una cosa salto, sarebbe solo fermare il comando e appendere. Quindi, quello che voglio fare, è impedire che ciò accada. In alternativa, voglio usare qualcosa come skip, quindi può ignorare il file e continuare comunque. Quindi penso che questo comando deve essere convogliato nel comando delete.

Spero che sia chiaro adesso.

Grazie in anticipo.

È stato utile?

Soluzione

Ti piace questa?

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

Altri suggerimenti

Crea le due file di comando ed eseguire delex.cmd. I file e le directory che non vengono eliminati verranno registrati a delex.txt. Quelli che pendono, avranno una finestra aperta cmd ridotta a icona che viene ucciso dopo un ritardo utilizzando ping (grazie al suggerimento di 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

Testato con:

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

Quando si utilizza del, e "Accesso negato" o "questo file è in uso da ..." si verifica, %errorlevel% è 0, quindi il test %errolevel% è inutile. Forse la seguente soluzione semplice funziona nel vostro caso:

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

Credo che questo è ciò che vuoi

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

Forse questo è più avanzato di quanto possa essere realizzato utilizzando l'elaborazione cmd appena incorporato. Perché non considerare l'utilizzo di Windows Scripting Host (VBScript / JScript) o addirittura PowerShell? Entrambi sarà probabilmente fornire il livello di controllo si richiede.

Prova questo file batch:

@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
)

Testato con la seguente struttura di directory:

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

Dopo aver eseguito il file batch, solo file1 e file5 sono stati lasciati. Un messaggio di "Accesso negato" è stato stampato per ogni file protetto da scrittura incontrato; se questo diventa fastidioso si re-indirizzare l'output del file batch come script.bat > NUL per nasconderlo.

Così, dopo tutte le risposte esistenti non soddisfacevano e è assolutamente necessario un salto all'interno del file batch, io farò un altro tentativo:

@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

Il trucco è che il ciclo for chiama una funzione secondaria all'interno dello stesso file e dà il parametro necessario per esso. Questa nuova chiamata viene eseguito in un nuovo contesto e può accedere solo alle variabili che sono definite dopo la do call :DoSomething nell'ordine dato loro.

Quindi devi accedere alle variabili qui con %1, %2, ecc Se si vuole lasciare questo contesto si deve fare un goto :eof per saltare alla fine del file (questo marcatore è predefinita in modalità batch e non dovrebbe si verificano all'interno del file), ciò che lascia il contesto e ritorna al ciclo for.

Dopo aver eseguito attraverso l'intero ciclo che abbiamo appena saltare al marcatore :end, fare un po 'di pulizia e sono finiti.

I seguenti estensioni cerca il file che si desidera in modo ricorsivo sotto il "dirname" albero di directory ed esegue commandstuff.bat contro che il nome del file:

  

per / r% i in (c:. \ Dirname * \ ext) fare   commandstuff "% i"

Commandstuff.bat si presenta così:

  

@ECHO OFF
del% 1
IF (% ERRORLEVEL% ==   0) goto END   
  : ERRORE
Errore Echo eliminazione% 1
  
  : END
fine Echo

Questa correrebbe commandstuff.bat per di eliminare i file desiderati. Quando c'è un errore sarà semplicemente eco i dettagli del file e continuare l'elaborazione del file successivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top