我客户端解决方案中的一些项目有一个构建后事件:xcopy
构建输出到特定文件夹。这在本地构建时工作正常。但是,在TeamCity中,我偶尔会获取
xcopy [...]退出代码2
如果我使用常规copy
,它会以代码1退出。我希望这与文件锁有关,虽然复制的特定文件不一样,所以可能只是锁定共享目标目录。我使用/y
来提示不覆盖文件。
为什么在TeamCity中失败但在本地失败?
答案 0 :(得分:133)
即使您使用xcopy提供/Y
开关,当xcopy不知道您要复制的内容是文件还是目录时,仍会出现错误。此错误将显示为“已退出代码2”。当您在命令提示符下运行相同的xcopy时,您将看到xcopy要求响应文件或目录。
要使用自动构建解决此问题,您可以使用管道回显预定义的响应。
要说你正在复制的东西是一个文件,在F
中回显:
echo F|xcopy /y ...
要说你要复制的东西是一个目录,在D
中回显:
echo D|xcopy /y ...
有时可以通过简单地使用复制命令而不是xcopy来解决上述问题:
copy /y ...
但是,如果存在导致最终文件目标的不存在的目录,则会出现“退出代码1”。
请记住:谨慎使用/C
开关和xcopy。
答案 1 :(得分:31)
我通过在路径末尾添加\来修复错误代码2,没有它,xcopy会认为它是文件而不是文件夹。
答案 2 :(得分:30)
如果在post build事件中使用xcopy,除了/ C之外还要使用/ Y开关。
/C Continues copying even if errors occur.
/Y Suppresses prompting to confirm you want to overwrite an existing file.
答案 3 :(得分:2)
我对此问题的解决方法是进入目标bin文件夹,并确保其中存在正确的子文件夹。手动创建子文件夹后,构建过程就会成功完成。
答案 4 :(得分:1)
可能你使用TeamCity和git。如果是,请检查git存储库中是否存在要复制的文件夹。通常git aviod将空项目文件夹添加到存储库,因此xcopy
无法找到它并生成错误。
您可以将一些空文本文件添加到空文件夹,提交并查看文件夹中的文件夹。
答案 5 :(得分:1)
xcopy with /c /y
为我修复了它。 xcopy
无效。我的出口是4,所以我选择了($TargetPath)
,但事实证明我需要在if $(ConfigurationName) == Debug copy "$(TargetPath)" "$(SolutionDir)\Folder\bin\Debug\$(TargetFileName)"
周围加上引号。
我的脚本:
{{1}}