Điều gì sẽ xảy ra khi Visual Studio cho tôi biết "xcopy đã thoát với mã 4"


126

Tôi không rành về các sự kiện sau xây dựng, vì vậy tôi hơi bối rối không biết chương trình của mình có vấn đề gì không. Khi biên dịch trong visual studio 2010, tôi nhận được những thứ sau:

The command "xcopy C:\Users\Me\Path\Foo.bar\Library\dsoframer.ocx C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
xcopy C:\Users\Me\Path\Foo.bar\ApplicationFiles C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
xcopy C:\Users\Me\Path\url\ C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
rmdir /S /Q C:\Users\Me\Path\Foo.bar\bin\Debug\.gwt-tmp" exited with code 4.    

Chương trình dường như chạy tốt, mặc dù có lỗi này, nhưng tôi không muốn bỏ qua vấn đề này và hy vọng không có gì xấu xảy ra. Thật kỳ lạ, dòng này bắt đầu chỉ là một lệnh duy nhất (xcopy đầu tiên) nhưng khi tôi tiếp tục biên dịch dự án (sửa các vấn đề khác, chủ yếu là tham chiếu), thông báo lỗi ngày càng mở rộng. Bất kỳ ý tưởng những gì có thể xảy ra?

Chỉnh sửa: Đây là các sự kiện postbuild có vẻ như không thành công -

xcopy $(ProjectDir)Library\dsoframer.ocx $(TargetDir) /Y /E /D
xcopy $(ProjectDir)ApplicationFiles $(TargetDir) /Y /E /D
xcopy $(SolutionDir)com.myUrl.gwt\www $(TargetDir) /Y /E /D
rmdir /S /Q $(TargetDir).gwt-tmp

2
Ngoài các câu trả lời bên dưới, hãy nhớ mở VS bằng Administrator privileges. Sao chép đến các vị trí cụ thể yêu cầu quyền quản trị.
Nikhil Agrawal

Câu trả lời:


167

Mã thoát Xcopy 4 có nghĩa là "Đã xảy ra lỗi khởi tạo. Không có đủ bộ nhớ hoặc dung lượng đĩa hoặc bạn đã nhập tên ổ đĩa không hợp lệ hoặc cú pháp không hợp lệ trên dòng lệnh. "

Có vẻ như Visual Studio đang cung cấp các đối số không hợp lệ cho xcopy. Kiểm tra lệnh sự kiện sau xây dựng của bạn qua Project > Right Click > Properties > Build Events > Post Build Event.

Lưu ý rằng nếu các $(ProjectDir)cụm từ macro hoặc tương tự có khoảng trắng trong các đường dẫn kết quả khi được mở rộng, thì chúng sẽ cần được đặt trong dấu ngoặc kép. Ví dụ:

xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1

Như tôi đã nói, tôi không biết nhiều về các kịch bản sự kiện hậu xây dựng (và tôi đã không viết chúng); tôi tìm cái này ở đâu?
Raven Dreamer

1
Đi tới Thuộc tính dự án> Xây dựng sự kiện
Mark Cidade

2
Thử gói mỗi lệnh bằng dấu ngoặc kép ( "command args").
Grant Thomas,

@Mark Cidade - Tôi dường như không có "Xây dựng sự kiện" ở bất kỳ đâu. Thuộc tính chung được liệt kê: "Dự án khởi động; Phụ thuộc dự án; Gỡ lỗi tệp nguồn; Cài đặt phân tích mã". Thuộc tính cấu hình được liệt kê: "cấu hình".
Raven Dreamer

4
@RavenDreamer: Nếu $(ProjectDir)(và / hoặc tương tự) có khoảng trắng trong đường dẫn mở rộng, thì nó sẽ cần được đặt trong dấu ngoặc kép. Ví dụ:xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1
Grant Thomas,

34

Chuyển tab đồng hồ sang "ouput" và tìm lệnh xcopy. Đôi khi ở đây, bạn tìm thấy một số thông báo khác (đầu ra xcopy thực tế) có thể giúp bạn giải quyết vấn đề. Nếu bạn không thấy tab đầu ra, hãy sử dụng menu View-Output để hiển thị nó.


30

Tôi ngoài câu trả lời được chấp nhận, lỗi cũng có thể xảy ra khi thư mục đích ở chế độ chỉ đọc (Thường gặp khi sử dụng TFS)


2
Và một cái gì đó bạn có thể thấy nếu bạn chuyển sang cửa sổ xuất như @FelicePollano được đề cập bên dưới.
Jedidja

20

Nếu không tìm thấy tệp nguồn, xcopy cũng trả về mã lỗi 4 .


3
đây là trường hợp của tôi. tôi đã sử dụng $(TargetDir)mà kết thúc bằng Release\ . Sử dụng $(ProjectDir)\bin\Releasemà không có dấu \\ hiệu hiệu quả với tôi
Multinerd

12

Tôi đã nhận được lỗi ' đã thoát bằng mã 4 ' khi lệnh xcopy cố gắng ghi đè lên tệp chỉ đọc. Tôi đã quản lý để giải quyết vấn đề này bằng cách thêm / R vào lệnh xcopy. Các / R chỉ ra chỉ đọc các tệp nên được ghi đè

lệnh cũ:

XCOPY /E /Y "$(ProjectDir)source file" "destination"

lệnh mới

XCOPY /E /Y /R "$(ProjectDir)source file" "destination"

8

Như các câu trả lời khác giải thích, mã thoát 4 có thể có nhiều nguyên nhân.

Tôi nhận thấy một trường hợp, trong đó tên đường dẫn kết quả vượt quá độ dài tối đa cho phép (giống như ở đây ).

Tôi đã thay thế xcopy bằng robocopy cho sự kiện xây dựng bài bị ảnh hưởng; robocopy dường như xử lý các đường dẫn hơi khác và có thể hoàn thành tác vụ sao chép mà xcopy không thể xử lý.


5

Nó có nghĩa là :

Đã xảy ra lỗi khởi tạo. Không có đủ bộ nhớ hoặc dung lượng ổ đĩa, hoặc bạn đã nhập tên ổ đĩa không hợp lệ hoặc cú pháp không hợp lệ trên dòng lệnh.

Vì vậy, về cơ bản nó có thể chỉ là về bất cứ điều gì haha ​​... hãy thử chạy lệnh lần lượt từ dấu nhắc lệnh để tìm ra phần nào trong lệnh nào đang gây rắc rối cho bạn.


3

Tôi đã nhận được điều này cùng với tin nhắn

Đặc điểm kỹ thuật ổ đĩa không hợp lệ

khi sao chép vào mạng chia sẻ mà không chỉ định tên ổ đĩa, ví dụ:

xcopy . \\localhost

Ở đâu

xcopy . \\localhost\share

đã được mong đợi


2

Tôi đã gặp sự cố này, vì vậy tôi đã chạy lệnh xcopy từ dòng lệnh và nó cho biết:

File creation error - The requested operation cannot be performed on a file with
 a user-mapped section open.

Nó thực sự là Visual Studio đang giữ một cái gì đó. Tôi vừa khởi động lại Visual Studio và nó đã hoạt động.


1

Trong trường hợp của tôi, vấn đề là do thứ tự xây dựng không chính xác. Một dự án có lệnh xcopy trên các sự kiện sau xây dựng để sao chép tệp từ thư mục bin sang thư mục khác. Nhưng do phụ thuộc không chính xác, các tệp mới đã được tạo trong thư mục bin trong khi xcopy đang diễn ra.

Trong VS nhấp chuột phải vào dự án nơi bạn có các sự kiện sau xây dựng. Đi tới Phụ thuộc Xây dựng> Phụ thuộc Dự án và đảm bảo rằng nó chính xác. Xác minh thứ tự xây dựng dự án (tab tiếp theo cho các phần phụ thuộc).


1

Lỗi này là do nếu có khoảng trắng nơi repo của bạn được sao chép. Ví dụ: dự án của tôi được sao chép ở vị trí bên dưới c://projects/My rest project thì bạn có thể thấy các khoảng trắng ở đó, nếu bạn thay đổi đường dẫn repo của mình thành bên dưới, nó sẽ hoạt động c://projects/myrestproject


0

Tôi đã từng gặp vấn đề tương tự. Bạn cũng có thể kiểm tra xem dấu gạch chéo đang trỏ theo cách nào. Đối với tôi, nó hoạt động khi sử dụng dấu gạch chéo ngược, thay vì dấu gạch chéo ngược. Thí dụ

xcopy /s /y "C:\SFML\bin\*.dll" "$(OutDir)"

Thay vì:

xcopy /s /y "C:/SFML/bin/*.dll" "$(OutDir)"

0

Tôi đã có một lệnh xây dựng bài đăng hoạt động tốt trước khi tôi cập nhật VS 2017. Hóa ra là các công cụ SDK đã cập nhật và theo một đường dẫn mới nên nó không thể tìm thấy công cụ tôi đang sử dụng để ký hợp đồng của mình.

Điều này đã thay đổi từ điều này ....

call "%VS140COMNTOOLS%vsvars32"
    "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64\sn.exe" -Ra "$(TargetPath)" "$(ProjectDir)Key.snk"

Tới đây ...

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\sn.exe" -Ra "$(TargetPath)" "$(ProjectDir)Key.snk"

Thay đổi rất tinh tế nhưng mang tính đột phá, vì vậy hãy kiểm tra đường dẫn của bạn sau khi cập nhật nếu bạn thấy lỗi này.


0

Một điều khác cần chú ý là dấu gạch chéo ngược kép, vì xcopynó không chấp nhận chúng trong tham số đường dẫn đầu vào (nhưng nó lại dung nạp chúng trong đường dẫn đầu ra ...).

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


0

Nếu bất kỳ giải pháp nào khác đang ở chế độ gỡ lỗi thì trước tiên hãy dừng tất cả chúng lại và sau đó khởi động lại studio trực quan. Nó đã làm việc cho tôi.


0

Điều này cũng có thể xảy ra nếu thư mục đích được sử dụng bởi một số quy trình khác . Đóng tất cả các chương trình có thể sử dụng thư mục đích và thử.

Bạn có thể sử dụng trình giám sát tài nguyên (công cụ cửa sổ) để kiểm tra các quy trình sử dụng thư mục đích của bạn.

Điều này đã làm việc cho tôi !.

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.