web-dev-qa-db-fra.com

Codes de retour de commande de copie Windows?

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 ...
)
24
Bill Ruppert

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.

31
paxdiablo

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
14
Wilson Waters

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.

11
Hand-E-Food

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.

1
Dominique