Tại sao một bước sau xây dựng (xcopy) đôi khi thoát với mã 2 trong bản dựng TeamCity?


93

Một vài dự án trong giải pháp của khách hàng của tôi có một sự kiện sau xcopyquá trình xây dựng : bản dựng xuất ra một thư mục cụ thể. Điều này hoạt động tốt khi xây dựng tại địa phương. Tuy nhiên, trong TeamCity, tôi thỉnh thoảng nhận được

xcopy [...] đã thoát bằng mã 2

Nếu tôi sử dụng thông thường copy, nó sẽ thoát bằng mã 1. Tôi hy vọng điều này có liên quan đến khóa tệp, mặc dù các tệp cụ thể đang được sao chép không giống nhau, vì vậy có lẽ chỉ khóa trên thư mục đích được chia sẻ. Tôi sử dụng /yđể không nhắc về việc ghi đè tệp.

Tại sao điều này không thành công trong TeamCity nhưng không phải cục bộ?


Tôi đã gặp vấn đề tương tự nhưng liên quan đến việc sao chép đồng thời cùng một tệp song song. Bạn có thể kiểm tra kỹ xem không có tệp nào được sao chép hai lần không?
Ignacio Soler Garcia,

4
Mã thoát 2 có nghĩa là The user pressed CTRL+C to terminate xcopy. Hehe.
Hans Passant

@SoMoS Có, các tệp được sao chép chắc chắn là khác biệt.
Tim Iles

@HansPassant Tôi không biết tại sao teamcity lại muốn nhấn CTRL + C vào tôi! :(
Tim Iles

5
Yah, tôi cũng vậy. Quy ước chung khác là mã thoát bằng lỗi hoặc ngoại lệ Windows cuối cùng. Lỗi 2 có nghĩa là "không tìm thấy tệp". Điều đó tất nhiên có ý nghĩa hơn rất nhiều.
Hans Passant

Câu trả lời:


146

Ngay cả khi bạn cung cấp công /Ytắc cho xcopy, bạn vẫn sẽ gặp lỗi khi xcopy không biết thứ bạn đang sao chép là tệp hay thư mục. Lỗi này sẽ xuất hiện dưới dạng "đã thoát với mã 2". Khi bạn chạy cùng một xcopy tại dấu nhắc lệnh, bạn sẽ thấy rằng xcopy đang yêu cầu phản hồi của tệp hoặc thư mục.

Để giải quyết vấn đề này với một bản dựng tự động, bạn có thể lặp lại một phản hồi được xác định trước bằng một đường ống.

Để nói rằng thứ bạn đang sao chép là một tệp, hãy lặp lại F:

echo F|xcopy /y ...

Để nói rằng thứ bạn đang sao chép là một thư mục, hãy lặp lại D:

echo D|xcopy /y ...

Đôi khi vấn đề trên có thể được giải quyết bằng cách sử dụng lệnh copy thay vì xcopy:

copy /y ...

Tuy nhiên, nếu có thư mục không tồn tại dẫn đến đích tệp cuối cùng, thì "đã thoát với mã 1" sẽ xảy ra.

Hãy nhớ: sử dụng công /Ctắc và xcopy một cách thận trọng.


Cảm ơn @Metro Smurf. Tôi không thể kiểm tra xem điều này có giải quyết được vấn đề của tôi hay không, nhưng những gì bạn nói nghe có vẻ thông minh nên tôi đã đánh dấu nó là câu trả lời. Chúc mừng!
Tim Iles

Tôi đã gặp phải cùng một vấn đề và cuối cùng đã kết thúc với đường ống trong phản hồi. Hy vọng rằng điều này sẽ giúp ai đó về lâu dài.
Metro Smurf

1
"Điều này không hoạt động trong các phiên bản Windows được bản địa hóa, trong đó các từ nhắc có thể khác. Một thủ thuật thay thế là thêm dấu hoa thị ' ' vào cuối trang đích, khi đó xcopy sẽ không nhắc Tệp / Thư mục. - Govert Jan 28 lúc 19:40 "Vì vậy, bạn có thể sao chép như thế này mà không cần echo D (không đáng tin cậy): XCOPY $ (ProjectDir) .. \ scripts * $ (TargetDir) scripts * / Y / R. Hoặc làm các bản sao như thế này mà không vang F: XCOPY D: \ file.zip c: \ renamedFile.zip / Y / R
leetNightshade

@leetNightshade - sẽ *hoạt động với các thư mục chứ? Hay điều này chỉ dành cho các tập tin?
Metro Smurf

@MetroSmurf Hm, có vẻ như việc định dạng ví dụ của tôi không thành công, thiếu dấu gạch chéo ngược (chắc hẳn tôi nghĩ rằng tôi đang cố gắng thoát khỏi một biểu tượng) và thiếu dấu hoa thị. Nhưng có, nó hoạt động với các thư mục và tệp. Đây là liên kết để câu trả lời Govert của: stackoverflow.com/a/14022309/353094
leetNightshade

37

Tôi đã sửa mã lỗi 2 bằng cách thêm \ vào cuối đường dẫn của mình, nếu không có nó, xcopy sẽ nghĩ rằng đó là một tệp thay vì một thư mục.


3
Đó là nó. Hoạt động tốt trên Windows 7, Visual Studio 2013. Cảm ơn rất nhiều!
Charles

33

Nếu bạn đang sử dụng xcopy trong một sự kiện xây dựng bài đăng, hãy sử dụng nút chuyển / Y bên cạnh / C.

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

4
Quá đơn giản! /Yngăn chặn lời nhắc! Tại sao điều này quá khó tìm?
SouthShoreAK

3
/ Y không chặn lời nhắc ghi đè, nhưng đó không phải là lý do duy nhất cho mã 2. RTFM sẽ không cho bạn biết điều gì gây ra chúng.
MSalters

2

Cách khắc phục của tôi cho vấn đề này là đi vào thư mục bin đích và đảm bảo rằng thư mục con thích hợp tồn tại ở đó. Sau khi thư mục con đó được tạo theo cách thủ công, quá trình xây dựng đã hoàn tất thành công.


2

copyđã sửa nó cho tôi. xcopy with /c /yđã không làm việc. Tôi đã nhận được lối ra 4 vì vậy tôi đã đi cùng xcopy, nhưng hóa ra tôi cần báo giá xung quanh ($TargetPath).

Kịch bản của tôi:

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

2

Có lẽ bạn đang sử dụng TeamCity với git. Nếu có, hãy kiểm tra xem các thư mục bạn muốn sao chép có tồn tại trong kho lưu trữ git hay không. Thông thường git aviod thêm các thư mục dự án trống vào kho lưu trữ, do đó xcopykhông thể tìm thấy nó và tạo ra lỗi.

Bạn có thể thêm một số tệp văn bản trống vào thư mục trống, cam kết và xem thư mục xuất hiện trong kho lưu trữ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.