Commande de copie de Windows codes de retour?
J'aimerais bien tester pour le succès ou l'échec d'une copie dans un fichier de commandes, mais je ne trouve pas de documentation sur ce que si tout errorlevel codes sont retourné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 ...
)
- Vous pouvez trouver rapidement que
copy a.txt a.txt
sera de retour un errorlevel non égale à zéro, etcopy a.txt b.txt
sera de retour un errorlevel de zéro. Mais comme d'autres l'ont souligné,xcopy
donne plus d'infos. Mais si vous n'avez pas besoin de cette info, juste un succès/échec,copy
est tout simplement parfait.
Vous devez vous connecter pour publier un commentaire.
Je préfère
xcopy
dans ce cas puisque le taux d'erreur sont documentées (voir xcopy documentation, paraphrasé ci-dessous):Dans tous les cas,
xcopy
est beaucoup plus puissant de la solution. Le l'équivalent de la documentation pourcopy
ne pas documenter les niveaux d'erreur.Que d'un côté, vous voudrez peut-être repenser votre utilisation de la
%errorlevel%
variable. Il a des résultats inattendus, au moins dans certaines versions de Windows, si quelqu'un a explicitement fait quelque chose de stupide comme:Dans ces cas, la variable sera utilisé plutôt que de prendre le réel niveau d'erreur. La voie "normale" de le faire, c'est (dans l'ordre décroissant depuis
errorlevel
est un "plus grand ou égal à" vérifier):En outre, si vous exécutez Win7 ou Win Server 2008 ou une version ultérieure, vous devriez regarder dans Robocopy, qui est maintenant le préféré de masse-copie de la solution.
for %%e in (5 4 3 2 1) do if errorlevel %%e goto reason-%%e
suivie parecho Copy OK
EXIT /B exitcode
que l'utilisation non standard, sans-papiers méthode pour définir un 32-bits signés valeur. Cependant, je vais vous offrir des excuses si vous me montrer toute la documentation sur la façon de retourner une variable errorlevel négative (une valeur supérieure à un octet) à partir d'un programme exécutable sous Windows/DOS de l'environnement.public class testprog{public static void main(String x[]){System.exit(-123);}}
puis l'exécuter. Après cela,echo %errorlevel%
sera en effet afficher -123. Non pas que tout cela est important pourxcopy
qui est documenté à seulement return 0 ou plus, alors peut-être que la discussion devrait être pris ailleurs 🙂xcopy /?
la deuxième ligne de sortie de lit "REMARQUE: Xcopy est maintenant obsolète, veuillez utiliser Robocopy." Je ne sais pas si c'est encore vrai dans les Windows 7/8, c'était peut-être de l'onu-déconseillé de nouveau. 🙂cmd.exe
peut afficher des valeurs négatives pour la commande. Windows utilise entier 32 bits non signé de statut de sortie (DWORD, UINT) dans son API, maiscmd.exe
peut afficher ce nombre entier non signé ses deux du compliment de valeur négative, exempleIl pourrait également être intéressant de souligner que xcopy ne permet pas toujours de retourner le code d'erreur que vous attendez.
Par exemple lorsque vous essayez de copier plusieurs fichiers avec un caractère générique, mais il n'y a pas de fichiers à copier vous s'attendre à un retour de code d'erreur de 1 ("Aucun fichier n'a été trouvé à la copie"), mais en fait il retourne 0 ("les Fichiers ont été copiés sans erreur")
sum(0) = 0
. Non pas qu'il n'est pas un argument pour la marche arrière, mais la copie rien ne l'est, de l'omi, certainement pas une situation d'échec: une liste de zéro opérations réussit toujours (pensez à LINQ ou d'autres requêtes SQL, ce n'est pas une erreur si le jeu de résultats est vide).Je crois
Copy
seulement renvoie 0 en cas de succès ou 1 en cas d'échec.XCopy
a documenté les codes de retour:Il y a aussi un point que je voudrais souligner:
xcopy
ainsi querobocopy
ne peut copier des fichiers, mais ils ne peuvent pas les renommer.En regardant la situation d'origine (
copy x y
, qui ressemble à un changement de nom pour moi), j'ai l'impression que lecopy
commande est toujours le seul adapté à cette fin.copy x y
était arbitraire, je ne voulais pas insinuer renomme uniquement. J'ai été en utilisant les 0 et les 1 de codes de retour avec copie et qu'ils fonctionnent très bien.XCOPY
, je l'ai fait pendant des années avec des scripts à partir du passé....ECHO F | XCOPY /Y /F "C:\Path\OrigFileName.txt" "C:\Path\NewFileName.txt"