Why would a post-build step (xcopy) occasionally e

2019-01-16 16:05发布

问题:

A few projects in my client's solution have a post-build event: xcopy the build output to a specific folder. This works fine when building locally. However, in TeamCity, I occasionally get

xcopy [...] exited with code 2

If I use regular copy, it exits with code 1. I expect this has something to do with file locks, although the specific files being copied are not the same, so perhaps just locking on the shared destination directory. I use /y to not prompt on overwriting files.

Why this fails in TeamCity but not locally?

回答1:

Even if you provide the /Y switch with xcopy, you'll still get an error when xcopy doesn't know if the thing you are copying is a file or a directory. This error will appear as "exited with code 2". When you run the same xcopy at a command prompt, you'll see that xcopy is asking for a response of file or directory.

To resolve this issue with an automated build, you can echo in a pre-defined response with a pipe.

To say the thing you are copying is a file, echo in F:

echo F|xcopy /y ...

To say the thing you are copying is a directoy, echo in D:

echo D|xcopy /y ...

Sometimes the above can be resolved by simply using a copy command instead of xcopy:

copy /y ...

However, if there are non-existent directories leading up to the final file destination, then an "exited with code 1" will occur.

Remember: use the /C switch and xcopy with caution.



回答2:

I fixed the error code 2 by adding a \ at the end of my path, without it, xcopy will think that it is a file instead of a folder.



回答3:

If you are using xcopy in a post build event use the /Y switch in addition to the /C.

/C           Continues copying even if errors occur.
/Y           Suppresses prompting to confirm you want to overwrite an existing file.


回答4:

My fix for this issue was to go into the target bin folder, and ensure that the proper subfolder exists there. Once that subfolder was manually created, the build process completed successfully.



回答5:

copy fixed it for me. xcopy with /c /y did not work. I was getting an exit 4 so I went with xcopy, but turned out I needed quotes around ($TargetPath).

My script:

if $(ConfigurationName) == Debug copy "$(TargetPath)" "$(SolutionDir)\Folder\bin\Debug\$(TargetFileName)"


回答6:

Probably you using TeamCity with git. If yes, check that folders you want to copy are exists in git repository. Usually git aviod adding empty project folders to repository, so xcopy fails to find it and generates a error.

You can add some empty text file to empty folder, commit and see folder appears in repository.