Salta in caso di errore
-
21-09-2019 - |
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.
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.