2009-12-27 21 views
4

i avoir le code suivant dans le lot (cmd):Ignorer lorsqu'une erreur se produit

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

EDIT: Pour rendre les choses plus claires: for /f... recherche un répertoire appelé « exemple » et des boucles pour rechercher pour plus de répertoires qu'un. le premier command est une commande de suppression, il supprime tous les fichiers dans le répertoire. Le command qui se produit lorsqu'une erreur se produit, est une commande echo qui écrit des informations sur l'erreur dans un fichier texte. maintenant le trou skip chose; parfois, les fichiers ne peuvent pas être supprimés en raison de access denied ou this file is in use by.... Normalement, que se passerait-il s'il n'y avait pas de saut, cela arrêterait simplement la commande et se bloquerait. Donc, ce que je veux faire, c'est empêcher cela. Alternativement, je veux utiliser quelque chose comme skip, de sorte qu'il peut passer le fichier et continuer de toute façon. Donc je pense que cette commande doit être redirigée vers la commande delete.

J'espère que c'est clair maintenant.

Merci d'avance.

+0

appeler à dir est assez stupide quand pour marcher un arbre de répertoire pour vous – Anders

+1

S'il vous plaît expliquer mieux ce que vous avez besoin. J'ai essayé de deviner vos intentions avec ma réponse, mais apparemment n'a pas réussi. Que voulez-vous dire par "sauter", alors? Peut-être que vous pouvez fournir une structure de répertoire exemple et le comportement attendu de votre script batch sur cette structure de répertoire. – atzz

+1

Votre utilisation du mot «skip» est extraordinairement ambigu. – Alan

Répondre

3

Comme ça?

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

Alternativement: 'command && (succès) || (erreur) ' – Joey

+0

@Johannes - wow, je ne savais pas à propos de" || "! On dirait une manière soignée d'écrire des alternatives courtes. – atzz

+0

ce n'est pas vraiment ce que je veux. Je veux laisser passer, et continuer. ce que fait la commande, elle recherche 'example', puis supprime tout dans ce répertoire. Le problème est que vous ne pouvez pas vraiment "sauter" facilement. –

0

Je crois que c'est ce que vous voulez

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

c'est la même chose que @atzz, encore une fois, lisez les commentaires, je n'aime pas ce genre de choses. –

+2

c'était ma meilleure tentative d'essayer de comprendre ce que vous voulez dire par "sauter". Faites des efforts pour améliorer votre explication, car si vous ne le faites pas, vous jetez un doute sur le montant que vous appréciez vraiment une bonne réponse. Votre manque d'intérêt à vous faire comprendre ne fait que rivaliser avec votre grossièreté. –

2

Créez les deux fichiers de commandes et exécutez delex.cmd. Les fichiers et les répertoires qui ne sont pas supprimés seront enregistrés dans delex.txt. Ceux qui sont bloqués auront une fenêtre cmd minimisée ouverte qui sera tuée après un délai en utilisant ping (merci à la suggestion 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 

Testé avec:

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

Je pense que celui-ci peut être amélioré pour fermer toutes les fenêtres «suspendues» après un délai d'attente donné. Ajoutez un windowtitle spécial à la commande 'start'. Utilisez http://malektips.com/dos0017.html pour simuler une commande "Wait" (par exemple, attendez 10 secondes après), et utilisez taskkill/fi "Windowtitle eq " pour tuer toutes les fenêtres suspendues. –

+0

excellente suggestion Doc - ça marche! – fupsduck

+0

+1 pour avoir une suggestion supplémentaire de travail! –

0

Peut-être est plus avancée que peut être accompli en utilisant seulement intégré dans le traitement de cmd. Pourquoi ne pas envisager d'utiliser Windows Scripting Host (vbscript/jscript) ou même PowerShell? Les deux vous fourniront probablement le niveau de contrôle que vous demandez.

1

Lorsque l'un utilise del et que le message «Accès refusé» ou «Ce fichier est utilisé par ...» s'affiche, %errorlevel% est 0, donc le test %errolevel% est inutile. Peut-être la solution simple suivante fonctionne dans votre cas:

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

mais il ne sauterait pas, n'est-ce pas? –

+0

Je l'ai essayé avec 3 fichiers dans un répertoire 'Exemple', un en écriture protégée et deux en cours d'utilisation, et je reçois 3 fois "fichier non supprimé". Si ce n'est pas ce que vous entendez par «sauter», donnez un meilleur exemple ou une meilleure explication. –

+0

+1 pour votre suggestion. – fupsduck

0

Essayez ce fichier 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 
) 

Testé avec la structure de répertoire suivant:

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

Après avoir exécuté le fichier batch, seulement file1 et file5 ont été laissés. Un message "Accès refusé" a été imprimé pour chaque fichier protégé en écriture rencontré; Si cela vous ennuie, vous redirigez la sortie du fichier batch comme script.bat > NUL pour le masquer.

0

Ainsi, après toutes les réponses existantes ne répondaient pas à vous et vous avez absolument besoin d'un saut au sein de votre fichier batch, je vais faire un autre essai:

@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 

L'astuce est que la boucle appelle un sous fonctionne dans le même fichier et lui donne le paramètre nécessaire. Ce nouvel appel s'exécute dans un nouveau contexte et ne peut accéder qu'aux variables qui sont définies après le do call :DoSomething dans l'ordre donné.

Vous devez donc accéder aux variables ici avec %1, %2, etc. Si vous voulez quitter ce contexte, vous devez faire un goto :eof pour passer à la fin du fichier (ce marqueur est prédéfini en mode batch et devrait pas dans votre fichier), ce qui laisse le contexte et retourne à la boucle for. Après avoir parcouru toute la boucle, nous passons au marqueur :end, nettoyons un peu et terminons.

0

Les regards suivants pour les extentions que vous voulez récursive sous l'arborescence "dirname" et exécute commandstuff.bat contre ce nom de fichier:

pour/r% i dans (c: \ dirname \ * .ext) ne commandstuff "% i"

Commandstuff.bat ressemble à ceci:

@ECHO OFF
del% 1
IF (% ERRORLEVEL% == 0) goto FIN
: ERREUR
Erreur Echo suppression de 1%

: FIN
fin Echo

Cela irait à commandstuff.bat pour vous de supprimer les fichiers que vous voulez. Quand il y a une erreur, elle fait simplement écho aux détails du fichier et continue à traiter le fichier suivant.