Windows copy command return codes?

I believe Copy only returns 0 for success or 1 for failure.

XCopy has documented return codes:

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.


It might also be worth pointing out that xcopy doesn't always return the error code you expect.

For example when trying to copy multiple files with a wildcard but there are no files to copy you expect a return error code of 1 ("No files were found to copy"), but it actually returns 0 ("Files were copied without error")

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

I'd opt for xcopy in this case since the error levels are documented (see xcopy documentation, paraphrased below):

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.

In any case, xcopy is a far more powerful solution. The equivalent documentation for copy does not document the error levels.


As an aside, you may want to rethink your use of the %errorlevel% variable. It has unexpected results, at least in some versions of Windows, if someone has explicitly done something silly like:

set errorlevel=22

In those cases, the actual variable will be used rather than grabbing the actual error level. The "normal" way of doing this is (in decreasing order since errorlevel is a "greater than or equal to" check):

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
)

In addition, if you are running Win7 or Win Server 2008 or later, you should look into Robocopy, which is now the preferred mass-copy solution.