Bản sao lệnh đã thoát với mã 4 khi xây dựng - Khởi động lại Visual Studio giải quyết nó


151

Thỉnh thoảng khi tôi xây dựng giải pháp của mình ở đây (với 7 dự án trong đó), tôi nhận được bản sao 'Lệnh sao chép bị lỗi với mã 4', trong Visual Studio 2010 Premium ed.

Điều này là do sự kiện hậu xây dựng không thể đi qua.

Đây là những gì giải quyết vấn đề, tạm thời

  • Đôi khi: Khởi động lại Visual Studio và tôi có thể xây dựng giải pháp
  • Đôi khi: Cả khởi động lại Visual Studio và trình quản lý tệp mà tôi chọn (Q-Dir 4.37) đều giải quyết được.

Đây là những gì sự kiện hậu xây dựng trông như thế nào:

xcopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)" /Y

Khi bạn nhận được bản sao lệnh đã thoát với lỗi mã [giá trị chèn], thông thường là do các lỗi sau:

  • quyền đọc / ghi
  • thiếu tập tin
  • thư mục sai

Tuy nhiên - rõ ràng vào những lúc tôi xây dựng giải pháp, không có vấn đề gì.

FYI, tôi đã gỡ cài đặt ReSharper 5.1.1 hai tuần trước và Visual Studio đã gây ra cho tôi một số lỗi kể từ đó (trong số đó không thể gỡ lỗi). Tôi đã cài đặt lại Visual Studio và nó hoạt động tốt hơn kể từ đó, nhưng vẫn gặp sự cố này. Nó có thể phải làm gì với một số thứ ReSharper đang ở đâu đó không?

Bạn đã có cùng một vấn đề và giải quyết nó? Hay bạn có bất kỳ giải pháp có thể cho nó?

Câu trả lời:


74

Tôi luôn luôn thấy đây là một vấn đề khóa tập tin. Mã 4 là tập tin không thể truy cập. Một giải pháp một phần tôi tìm thấy là sử dụng tùy chọn / C cho xcopy (tiếp tục bị lỗi). Không thực sự là một giải pháp nhưng chủ yếu là nó đã ngăn các bản dựng của tôi thất bại.

Một giải pháp khác chỉ hoạt động trên 32 bit là sử dụng trình mở khóa công cụ mở để giải phóng các thẻ điều khiển windows trên tệp trước khi sao chép.

Chỉnh sửa: Tôi vừa nhận ra rằng nó cũng hoạt động dưới 64 bit.


3
Tôi đã thêm tùy chọn / C vào lệnh xcopy ở trên và bản dựng đã thành công. Cảm ơn! Unlocker là vô giá tại các thời điểm.
Martin S Ek

2
Tôi gặp vấn đề này vì một trong các tệp chỉ đọc. Khi tôi thay đổi điều đó, nó đã hoạt động.
Bob Horn

Tôi cũng có thể chứng thực rằng vấn đề này đã được giải quyết bằng cách xóa quyền chỉ đọc đối với các tệp vi phạm. Chúng tôi có một thư mục bin bên ngoài gây ra sự cố được mô tả. Khi tôi xóa thuộc tính chỉ đọc, lỗi sẽ biến mất khi cố gắng xây dựng giải pháp.
eniacAvenger

3
Trình mở khóa này mà bạn đang chỉ đến được phát hiện là vi-rút chỉ bằng mọi thứ. (google công cụ duyệt an toàn, eset, virustotal ...). dường như là một cuộc thảo luận về nó ở đây cnet.com/forums/discussions/unlocker-contains-malware-558941
v.oddou

Hãy nhớ câu trả lời này bao nhiêu tuổi. Virus mà bạn cáo buộc thực sự có vẻ là công cụ lưu trữ quảng cáo dường như được tích hợp trong trình cài đặt chứ không phải phần mềm mở khóa.
Preet Sangha

196

Mặc dù /Ccó thể bỏ qua lỗi, nhưng nó có thể không phải là giải pháp thực sự vì có thể có các tệp PHẢI được sao chép để quá trình xây dựng thành công.

Vấn đề phổ biến nhất là các trích dẫn bị thiếu xung quanh các thẻ lệnh được xác định trước (chẳng hạn như $TargetDir). Khi một người tạo các nhánh và đường dẫn khác nhau trong mã hoặc TFS, có khả năng rất cao điều này xảy ra.

Đôi khi nếu tập tin chỉ được đọc, nó cũng sẽ gây ra vấn đề. Thêm /Rtùy chọn để cho phép các tệp chỉ đọc được sao chép qua. Bạn có thể tìm thấy danh sách các tùy chọn có sẵn tại:

http://www.microsoft.com/resource/documentation/windows/xp/all/proddocs/en-us/xcopy.mspx?mfr=true

Một vấn đề khác có thể là thư mục cơ bản không thể được truy cập. Nếu vậy, cố gắng thực hiện "start xcopy"thay vì "xcopy". Điều này sẽ mở một cửa sổ lệnh khác nhưng với tư nhân quản trị viên.


53
'bắt đầu' đã sửa nó cho tôi ... từ các diễn đàn khác, đây dường như là vấn đề về quyền mà 'bắt đầu' giải quyết, mặc dù đích đến có FullControl cho 'Mọi người' trên hộp của tôi. Ngoài ra, bạn có thể chạy 'start / MIN xcopy ...' để giảm thiểu hiện tượng nhấp nháy cửa sổ
mdisibio

2
Tôi đã thay đổi c: \ windows \ system32 \ xcopy.exe $ (TargetPath) <đường dẫn đích> thành c: \ windows \ system32 \ xcopy.exe "$ (TargetPath)" <đường dẫn đích> và không gặp vấn đề gì trong 50+ cuối cùng xây dựng.
pennyrave

1
Tôi đã sử dụng "$ (OutDir) $ (TargetFileName)", thay đổi nó thành "$ (TargetPath)" để giải quyết vấn đề. Cũng như sử dụng 'bắt đầu'!
lướt

Vấn đề của tôi dường như đến từ việc sử dụng ký tự en-dash trong một trong các tên thư mục mẹ thay vì dấu gạch nối. Tôi đã mắc lỗi sao chép / dán tên của thư mục nhánh từ word, giống như "1234 - ABCD". Đổi tên thành "1234 - ABCD" và xcopy hiện hoạt động tốt.
Sudeep

thêm vào start/R, chỉ trong trường hợp ... không chắc cái nào đã lừa, nhưng nó đã hoạt động! Cảm ơn!
sǝɯɐſ

19

Tôi đã vượt qua cùng một lỗi, nhưng nó không phải là do tập tin bị khóa, nhưng tập tin bị thiếu.

Lý do tại sao VS cố gắng sao chép một tệp không tồn tại, là do lệnh sự kiện Post-build.

Sau khi tôi xóa nó, vấn đề đã được giải quyết.

CẬP NHẬT:

Như @rhughes đã nhận xét:

Vấn đề thực sự là làm thế nào để lệnh ở đây hoạt động, thay vì loại bỏ nó.

và anh ấy hoàn toàn đúng.

nhập mô tả hình ảnh ở đây


1
Nếu bạn đã sao chép một tập tin trong quá trình xây dựng sau, rất có thể lý do là vì bạn đã nhập một lệnh ở đây. Vấn đề thực sự là làm thế nào để lệnh ở đây hoạt động, thay vì loại bỏ nó.
rhughes

9

Tôi cũng đã phải đối mặt với vấn đề này. Kiểm tra kết quả trong cửa sổ lỗi.

Trong trường hợp của tôi, một cái đuôi \bị lỗi xcopy (như tôi đang sử dụng $(TargetDir)). Trong trường hợp của tôi $(SolutionDir)..\bin. Nếu bạn đang sử dụng bất kỳ đầu ra nào khác, điều này cần phải được điều chỉnh.

Cũng lưu ý rằng start xcopykhông sửa nó, nếu lỗi không còn sau khi biên dịch. Nó có thể vừa bị chặn bởi dòng lệnh và không có tập tin nào thực sự được sao chép!

Bạn có thể btw thực hiện thủ công các lệnh xcopy của mình trong một vỏ lệnh. Bạn sẽ nhận được nhiều chi tiết hơn khi thực hiện chúng ở đó, chỉ cho bạn đi đúng hướng.


Điều tương tự cũng xảy ra với tôi với $ (OutDir). Dường như tất cả các macro đường dẫn đều có "\" ở cuối và nó bị
sập

6

Trong trường hợp sự kiện xây dựng bài đăng chứa lệnh copy / xcopy để sao chép đầu ra của bản dựng vào một thư mục (thường là hoạt động xây dựng bài phổ biến nhất), sự cố có thể xảy ra trong trường hợp đường dẫn thư mục đầy đủ của đích hoặc nguồn đích chứa tên thư mục bao gồm tên thư mục bao gồm không gian. Xóa không gian cho (các) tên thư mục và thử.


5

Như đã đề cập trong nhiều trang web, có nhiều lý do cho việc này. Đối với tôi đó là do độ dài của Nguồn và Đích (Độ dài đường dẫn). Tôi đã thử xcopy trong dấu nhắc lệnh và tôi không thể nhập nguồn và đường dẫn hoàn chỉnh (sau một số ký tự, nó sẽ không cho phép bạn nhập). Sau đó tôi giảm chiều dài đường dẫn và có thể chạy. Hi vọng điêu nay co ich.


4

Chạy VS trong chế độ Quản trị viên và nó sẽ hoạt động tốt.


1
Tôi đang chạy VS với tư cách Quản trị viên nhưng điều này không hiệu quả với tôi.
Arafat

Một số người dùng có thể không thể chạy trong chế độ Quản trị viên.
MrSpudtastic

3

Tôi gặp lỗi này vì tài khoản người dùng mà TFS Build Service đang chạy không có quyền ghi vào thư mục đích. Right-click on the folder-->Properties-->Security.


Ngả mũ trước "Tangodancer" và "Abdul Rahman". Nhấp chuột phải vào thư mục -> Thuộc tính -> Bảo mật đã giải quyết vấn đề cho tôi trên hệ thống XP SP3 độc lập Cảm ơn BẠN

3

Điều này có thể xảy ra trong nhiều trường hợp:

  1. Khi đường dẫn chuỗi hoàn chỉnh dài hơn 254 ký tự.
  2. Khi tên của tập tin được sao chép là sai.
  3. Khi đường dẫn đích bị sai.
  4. Khi thuộc tính readonly được đặt trên tệp đã sao chép hoặc thư mục đích.

2

Tôi đã gặp lỗi này vì tập tin đã được mở trong một trường hợp khác.

Khi tôi đóng tệp và xây dựng lại giải pháp, nó đã được sao chép thành công.


2

Tôi đã đối mặt với vấn đề tương tự trong trường hợp XCOPY sau khi xây dựng xong. Trong trường hợp của tôi, sự cố đã xảy ra do quyền READ-CHỈ được đặt trên các thư mục.

Tôi đã thêm lệnh attrib -R trước XCOPY và nó đã giải quyết được vấn đề.

Hy vọng nó sẽ giúp được ai đó!


2

Tôi đã có cùng một lỗi với xcopy liên quan đến Test Engine. Tôi đang sử dụng VisualStudio Professional 2013. Theo mặc định Kiểm tra -> Cài đặt kiểm tra -> Keep Test Execut Engine Running dường như là lý do cho mã lỗi 4 của tôi với xcopy. Tắt nó đã giải quyết vấn đề. Các công cụ thực thi dường như tiếp tục giữ một số.


1

Tôi đã từng gặp vấn đề tương tự. Một 'Giải pháp sạch' đơn giản trong VS đã xóa lỗi, nhưng đó chỉ là một giải pháp tạm thời.


Tôi đang gặp vấn đề này và "Giải pháp sạch" không giúp tôi. "Giải pháp sạch" có hiệu quả với bạn mọi lúc không?
qxotk

1

Tôi thấy rằng việc cài đặt tham số Copy To Output Directory của tập tin thành Copy Luôn có vẻ như đã giải quyết được vấn đề khóa. Mặc dù bây giờ tôi có 2 bản sao của các tập tin và cần phải xóa một.


1

Tôi đã từng gặp vấn đề tương tự. Tuy nhiên, không có gì làm việc cho tôi. Tôi đã giải quyết vấn đề bằng cách thêm

exit 0

mã của tôi Vấn đề là trong khi tôi đang sao chép các tập tin, đôi khi không thể tìm thấy tập tin cuối cùng và con dơi trả về giá trị khác không.

Hy vọng điều này sẽ giúp được ai đó!


1

Nếu bạn đang chạy Windows 7 trở đi, bạn có thể thử lệnh 'robocopy' mới:

robocopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)"

Thông tin thêm về robocopy có thể được tìm thấy ở đây .


1

Tôi phải đối mặt với cùng một vấn đề. Tôi đã xóa các sự kiện hậu xây dựng và nó bắt đầu hoạt động. Đôi khi chúng ta thêm một số thành phần SQL, nó cũng có thể thêm các lệnh xây dựng bài.


1

Tôi nhận được một cái gì đó tương tự bằng cách sử dụng xcopy với tùy chọn / loại trừ. Trong trường hợp của tôi, tôi thấy rằng việc chỉnh sửa sự kiện hậu xây dựng (một cái gì đó vô hại như một dòng mới sau lệnh) và lưu dự án gây ra lỗi xảy ra. Lưu lại tệp được chỉ định trong tùy chọn / loại trừ khiến nó hoạt động trở lại.


1

Khi tôi đang viết thư viện DLL, tôi đã sử dụng lệnh xcopy để sao chép thư viện nơi chương trình có thể tìm và tải nó. Sau nhiều lần mở và đóng chương trình, vẫn còn một quy trình mở của nó trong taskmanager mà tôi không nhận ra.

Tìm kiếm bất kỳ quá trình mà tập tin có thể được sử dụng và đóng nó.


1

Điều gì đã sửa nó cho tôi : đào sâu vào giải pháp cụ thể cho dự án bạn muốn tức là KHÔNG phải tệp giải pháp tổng thể cho tất cả các dự án.

Hãy thử - Tôi đã thử mọi thứ khác được đề cập ở đây nhưng vô ích.


1

Tôi không thấy bất cứ điều gì ở đây để đề xuất rằng đây là một ứng dụng web nhưng tôi đã tự mình trải nghiệm vấn đề này - tôi đã nhận được hai lệnh xcopy trong một sự kiện hậu xây dựng và chỉ một trong số đó là thất bại. Một cái gì đó có khóa trên tệp và đó không phải là Visual Studio (vì tôi đã thử khởi động lại nó.)

Điều khác duy nhất có thể sử dụng dll tôi xây dựng là IIS. Và lo và kìa,

Một đơn giản iisresetđã lừa tôi.


1

Tôi gặp vấn đề tương tự. Nó được gây ra bởi có cùng một cờ hai lần, ví dụ:

if $ (Cấu hình tên) == Phát hành (xcopy "$ (TargetDir) . " "$ (SolutionDir) Triển khai \ $ (ProjectName) \" / e / d / i / y / e)

Quan sát rằng cờ "/ e" xuất hiện hai lần. Loại bỏ các bản sao đã giải quyết vấn đề.


1

Trong trường hợp của tôi, tôi $(OutDir)chỉ đơn giản ..\..\Build\là một số đường dẫn tương đối. Và, khi tôi đang cố gắng xcopy như sau xcopy /y "$(OutDir)Proj1.dll" "Anypath\anyfolder\" tôi đã nhận được lỗi thoát mã 4.

Điều gì đã xảy ra, lệnh này đã được thực thi trong chính $ (OutDir) (trong thư mục xây dựng trường hợp của tôi) chứ không phải thư mục chứa tệp csproj của dự án (như chúng ta thường mong đợi). Do đó, tôi tiếp tục nhận đượcFile not found lỗi (tương ứng với mã thoát 4).

Tôi không thể tìm ra điều này cho đến khi tôi viết cdtrong các sự kiện Post Build, để in thư mục này sẽ được thực thi.

Vì vậy, để tóm tắt, nếu chúng tôi muốn copy/ xcopytập tin từ $(OutDir), hãy sử dụng "$(TargetDir)"(đó là đường dẫn hoàn chỉnh cho thư mục đầu ra) hoặc không cần chỉ định bất kỳ đường dẫn nào cả.


0

Có thể được gây ra bởi VMWare Workstation với Shared Folders

Tôi luôn gặp vấn đề khi thư mục Destinatinon của xcopy cũng được ánh xạ là Thư mục dùng chung trong VM.

Tôi đã giải quyết nó bằng một đoạn script chạy trong vm và xóa nội dung của thư mục dùng chung.


0

Để mở rộng câu trả lời của rhughes,

Bản sao hoạt động rất đẹp, chỉ cần bạn cần bao gồm các thư mục con bạn có thể sử dụng /eđể bao gồm subs và sao chép các thư mục trống hoặc /sđể bao gồm subs không bao gồm các thư mục trống.

Ngoài ra, robocopy sẽ báo cáo lại một số điều như nếu các tệp mới được sao chép, điều này sẽ khiến VS phàn nàn vì bất cứ điều gì trên 0 là thất bại và robocopy sẽ trả về 1 nếu tìm thấy các tệp mới. Giá trị của nó phải kể đến là bản sao đầu tiên so sánh Nguồn / Dest và chỉ sao chép các tệp được cập nhật / mới.

Để sử dụng:

(robocopy "$(SolutionDir)Solution Items\References\*.dll" "$(TargetDir)") ^& IF %ERRORLEVEL% LEQ 4 exit /B 0

0

Nếu bạn ở đây vì dự án của bạn không xây dựng được trên máy chủ xây dựng, nhưng xây dựng "thủ công" tốt trên máy dev và bạn xcopychỉ làm việc để gỡ lỗi và mô phỏng môi trường sản xuất trên máy dev, thì bạn có thể muốn xem tại giải pháp này:

https://stackoverflow.com/a/1732478/2279059

Bạn chỉ cần tắt các sự kiện xây dựng bài đăng trên máy chủ xây dựng bằng cách sử dụng

msbuild foo.sln /p:PostBuildEvent=

Điều này là không đủ nếu bạn có các sự kiện xây dựng bài đăng khác cũng cần chạy trên máy chủ xây dựng và nó không phải là một giải pháp chung. Tuy nhiên, vì có rất nhiều nguyên nhân khác nhau của vấn đề này, không thể có một giải pháp chung. Một trong nhiều câu trả lời cho câu hỏi này (và các bản sao của nó) có thể sẽ có ích, nhưng hãy cẩn thận với các phương pháp chỉ bằng cách nào đó tránh được việc xử lý lỗi (chẳng hạn như xcopy /C). Chúng có thể phù hợp với bạn, đặc biệt là trong kịch bản máy chủ xây dựng, nhưng tôi nghĩ cái này đáng tin cậy hơn, NẾU nó có thể được sử dụng.

Người ta cũng đề xuất rằng với các phiên bản mới hơn của Visual Studio, vấn đề không còn tồn tại, vì vậy nếu bạn đang sử dụng phiên bản cũ, hãy xem xét cập nhật các công cụ xây dựng của mình.


0

Mã lỗi 4 có thể có nhiều ý nghĩa, vì vậy tôi cũng khuyên bạn nên đọc các câu trả lời khác cho đến khi bạn tìm thấy giải pháp phù hợp với mình VÀ bạn hiểu TẠI SAO nó hoạt động (một số giải pháp chỉ vô hiệu hóa xử lý lỗi, có thể chỉ che giấu vấn đề nhưng không giải quyết nó).

Đây có thể là một vấn đề khóa tập tin liên quan đến xây dựng song song. Một cách giải quyết là không sử dụng tòa nhà song song. Đây là hành vi mặc định, nhưng nếu bạn đang sử dụng -mtùy chọn, thì các dự án sẽ được xây dựng song song. Các biến thể sau đây không nên xây dựng các dự án song song, do đó bạn sẽ không gặp phải vấn đề khóa tệp.

msbuild -m:1
msbuild -maxcpucount:1
msbuild

Lưu ý rằng, trái với những gì đã nói ở đây, điều này thậm chí xảy ra với phiên bản "mới nhất" của MSBuild (từ Build Tools cho Visual Studio 2019).

Giải pháp tốt nhất có lẽ là đảm bảo bạn không cần phải sao chép các tệp trong bước hậu xây dựng. Trong một số trường hợp, bạn cũng có thể tắt các bước sau khi xây dựng khi xây dựng với MSBuild trên máy chủ xây dựng: https://stackoverflow.com/a/55899347/2279059

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.