Je souhaite tester le succès/l'échec d'une copie dans un fichier de traitement par lots, mais je ne trouve aucune documentation sur les éventuels codes de niveau d'erreur renvoyés. Par exemple
copy x y
if %errorlevel%. equ 1. (
echo Copy x y failed due to ...
exit /B
) else (
if %errorlevel% equ 2. (
echo Copy x y failed due to ...
exit /B
)
... etc ...
)
Dans ce cas, je choisirais xcopy
puisque les niveaux d'erreur sont documentés (voir documentation xcopy }, paraphrasée ci-dessous):
Exit
code Description
==== ===========
0 Files were copied without error.
1 No files were found to copy.
2 The user pressed CTRL+C to terminate xcopy.
4 Initialization error occurred. There is not
enough memory or disk space, or you entered
an invalid drive name or invalid syntax on
the command line.
5 Disk write error occurred.
Dans tous les cas, xcopy
est une solution beaucoup plus puissante. La documentation équivalente pour copy
ne documente pas les niveaux d'erreur.
En passant, vous voudrez peut-être repenser votre utilisation de la variable %errorlevel%
. Cela a des conséquences désagréables (du moins dans certaines versions de Windows) si quelqu'un a explicitement fait quelque chose d'idiot comme:
set errorlevel=22
Dans ces cas, la variable réelle sera utilisée plutôt que de rechercher le niveau d'erreur réel. La manière "normale" de procéder est la suivante (dans l'ordre décroissant puisque errorlevel
est un contrôle "supérieur ou égal à"):
if errorlevel 2 (
echo Copy x y failed due to reason 2
exit /B
)
if errorlevel 1 (
echo Copy x y failed due to reason 1
exit /B
)
Si vous exécutez Win7 ou Win Server 2008 ou une version ultérieure, vous devriez vous tourner vers Robocopy , qui est maintenant la solution de copie de masse préférée.
Il est également intéressant de noter que xcopy ne renvoie pas toujours le code d'erreur attendu.
Par exemple, lorsque vous essayez de copier plusieurs fichiers avec un caractère générique mais qu'il n'y a aucun fichier à copier, vous vous attendez à un code d'erreur de retour de 1 ("Aucun fichier à copier"), mais il renvoie en fait 0 ("Les fichiers ont été copiés sans erreur" )
C:\Users\wilson>mkdir bla
C:\Users\wilson>mkdir blert
C:\Users\wilson>xcopy bla\* blert\
0 File(s) copied
C:\Users\wilson>echo %ERRORLEVEL%
0
Je crois que Copy
ne retourne que 0 en cas de succès ou 1 en cas d'échec.
XCopy
a des codes de retour documentés:
0 = Les fichiers ont été copiés sans erreur.
1 = Aucun fichier à copier n'a été trouvé.
2 = L'utilisateur a appuyé sur CTRL + C pour mettre fin à xcopy.
4 = une erreur d'initialisation s'est produite. Il n'y a pas assez de mémoire ou d'espace disque, ou vous avez entré un nom de lecteur non valide ou une syntaxe non valide sur la ligne de commande.
5 = Une erreur d'écriture de disque s'est produite.
Je voudrais également souligner un point: xcopy
, ainsi que robocopy
peuvent uniquement copier des fichiers, mais ils ne peuvent pas les renommer.
En regardant la situation initiale (copy x y
, qui me ressemble), j’ai l’impression que la commande copy
est toujours la seule qui convient à cette fin.