เกิดอะไรขึ้นเมื่อ Visual Studio บอกฉันว่า“ xcopy ออกด้วยรหัส 4”


126

ฉันไม่ค่อยคุ้นเคยกับเหตุการณ์หลังการสร้างดังนั้นฉันจึงสับสนเล็กน้อยว่าเกิดอะไรขึ้นกับโปรแกรมของฉัน เมื่อรวบรวมใน Visual Studio 2010 ฉันจะได้รับสิ่งต่อไปนี้:

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.    

ดูเหมือนโปรแกรมจะทำงานได้ดีแม้จะมีข้อผิดพลาดนี้ แต่ฉันไม่ต้องการเพิกเฉยต่อปัญหานี้และหวังว่าจะไม่มีอะไรเลวร้ายเกิดขึ้น น่าแปลกที่บรรทัดนี้เริ่มต้นจากคำสั่งเดียว (xcopy แรก) แต่เมื่อฉันรวบรวมโปรเจ็กต์ต่อไป (แก้ไขปัญหาอื่น ๆ ส่วนใหญ่อ้างอิง) ข้อความแสดงข้อผิดพลาดก็ขยายใหญ่ขึ้นเรื่อย ๆ มีความคิดว่าจะเกิดอะไรขึ้นบ้าง?

แก้ไข: นี่คือเหตุการณ์หลังการสร้างที่ดูเหมือนจะล้มเหลว -

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
นอกเหนือจากคำตอบด้านล่างยังให้แน่ใจว่าจะเปิด VS Administrator privilegesกับ การคัดลอกไปยังตำแหน่งที่ต้องการต้องมีสิทธิ์ของผู้ดูแลระบบ
Nikhil Agrawal

คำตอบ:


167

รหัสทางออก Xcopy 4 หมายถึง " เกิดข้อผิดพลาดในการเริ่มต้นมีหน่วยความจำหรือพื้นที่ดิสก์ไม่เพียงพอหรือคุณป้อนชื่อไดรฟ์ที่ไม่ถูกต้องหรือไวยากรณ์ที่ไม่ถูกต้องในบรรทัดคำสั่ง "

ดูเหมือนว่า Visual Studio ส่งอาร์กิวเมนต์ที่ไม่ถูกต้องให้กับ xcopy ตรวจสอบคำสั่งเหตุการณ์ post-build Project > Right Click > Properties > Build Events > Post Build Eventของคุณผ่านทาง

โปรดทราบว่าหาก$(ProjectDir)คำศัพท์มาโครหรือคำที่คล้ายกันมีช่องว่างในเส้นทางผลลัพธ์เมื่อขยายแล้วคำเหล่านี้จะต้องถูกรวมไว้ด้วยเครื่องหมายคำพูดคู่ ตัวอย่างเช่น:

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

อย่างที่บอกไปว่าฉันไม่รู้มากเกี่ยวกับสคริปต์เหตุการณ์หลังการสร้าง (และฉันไม่ได้เขียนสิ่งเหล่านี้) ฉันจะหาสิ่งนี้ได้ที่ไหน
Raven Dreamer

1
ไปที่ project Properties> Build Events
Mark Cidade

2
ลองตัดแต่ละคำสั่งด้วยเครื่องหมายคำพูดคู่ ( "command args")
Grant Thomas

@Mark Cidade - ดูเหมือนจะไม่มี "Build Events" ที่ไหนเลย คุณสมบัติทั่วไปที่ระบุไว้: "โครงการเริ่มต้น; การพึ่งพาโครงการ; ไฟล์ซอร์สดีบัก; การตั้งค่าการวิเคราะห์โค้ด" Listed Configuration Properties: "configuration".
Raven Dreamer

4
@RavenDreamer: หาก$(ProjectDir)(และ / หรือคล้ายกัน) มีช่องว่างในเส้นทางที่ขยายแล้วจะต้องมีเครื่องหมายอัญประกาศ ตัวอย่างเช่น:xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1
Grant Thomas

34

เปลี่ยนแท็บนาฬิกาเป็น "ouput" และมองหาคำสั่ง xcopy บางครั้งที่นี่คุณจะพบข้อความเพิ่มเติม (เอาต์พุต xcopy จริง) ที่สามารถช่วยคุณแก้ปัญหาได้ หากคุณไม่เห็นแท็บเอาต์พุตให้ใช้เมนู View-Output เพื่อแสดง


30

ฉันนอกเหนือจากคำตอบที่ยอมรับแล้วข้อผิดพลาดยังสามารถเกิดขึ้นได้เมื่อโฟลเดอร์ปลายทางเป็นแบบอ่านอย่างเดียว (ทั่วไปเมื่อใช้ TFS)


2
และบางสิ่งที่คุณสามารถดูได้หากคุณเปลี่ยนไปใช้หน้าต่างเอาต์พุตตามที่ @FelicePollano กล่าวถึงด้านล่าง
Jedidja

20

หากไม่พบไฟล์ต้นฉบับxcopyจะส่งคืนรหัสข้อผิดพลาด4ด้วย


3
นี่เป็นกรณีของฉัน ฉันใช้$(TargetDir)ซึ่งลงท้ายด้วยRelease\ . การใช้$(ProjectDir)\bin\Releaseโดยไม่ต้องต่อท้ายใช้\\ งานได้สำหรับฉัน
Multinerd

12

ฉันได้รับข้อผิดพลาด' exited with code 4 ' เมื่อคำสั่ง xcopy พยายามเขียนทับไฟล์แบบอ่านอย่างเดียว ฉันจัดการเพื่อแก้ปัญหานี้โดยเพิ่ม/ Rในคำสั่ง xcopy / Rหมายถึงอ่านเท่านั้นไฟล์ควรจะถูกเขียนทับ

คำสั่งเก่า:

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

คำสั่งใหม่

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

8

ตามที่คำตอบอื่น ๆ อธิบายรหัสออก 4อาจมีสาเหตุหลายประการ

ฉันสังเกตเห็นกรณีที่ชื่อพา ธที่เป็นผลลัพธ์เกินความยาวสูงสุดที่อนุญาต (เช่นเดียวกับที่นี่ )

ฉันได้แทนที่ xcopy ด้วย robocopy สำหรับเหตุการณ์สร้างโพสต์ที่ได้รับผลกระทบ ดูเหมือนว่า robocopy จะจัดการกับเส้นทางที่แตกต่างกันเล็กน้อยและสามารถทำสำเนางานที่ xcopy ไม่สามารถจัดการได้


5

หมายความว่า :

เกิดข้อผิดพลาดในการเริ่มต้น มีหน่วยความจำหรือพื้นที่ดิสก์ไม่เพียงพอหรือคุณป้อนชื่อไดรฟ์ที่ไม่ถูกต้องหรือไวยากรณ์ที่ไม่ถูกต้องในบรรทัดคำสั่ง

โดยพื้นฐานแล้วมันอาจจะเกี่ยวกับอะไรก็ได้ฮ่า ๆ ... ลองเรียกใช้คำสั่งทีละคำสั่งจากพรอมต์คำสั่งเพื่อดูว่าส่วนใดของคำสั่งที่ทำให้คุณมีปัญหา


3

ฉันได้รับสิ่งนี้พร้อมกับข้อความ

ข้อกำหนดของไดรฟ์ไม่ถูกต้อง

เมื่อคัดลอกไปยังเครือข่ายแชร์โดยไม่ระบุชื่อไดรฟ์เช่น

xcopy . \\localhost

ที่ไหน

xcopy . \\localhost\share

เป็นที่คาดหวัง


2

ฉันพบปัญหานี้ดังนั้นฉันจึงรันคำสั่ง xcopy จากบรรทัดคำสั่งและมันบอกว่า:

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

จริงๆแล้ว Visual Studio กำลังจับอะไรบางอย่าง ฉันเพิ่งรีสตาร์ท Visual Studio และใช้งานได้


1

ในกรณีของฉันปัญหาเกิดจากลำดับการสร้างที่ไม่ถูกต้อง โครงการหนึ่งมีคำสั่ง xcopy เกี่ยวกับเหตุการณ์หลังการสร้างเพื่อคัดลอกไฟล์จากโฟลเดอร์ bin ไปยังโฟลเดอร์อื่น แต่เนื่องจากไฟล์ใหม่ที่อ้างอิงไม่ถูกต้องถูกสร้างขึ้นในโฟลเดอร์ bin ในขณะที่ xcopy กำลังดำเนินการอยู่

ใน VS คลิกขวาที่โครงการที่คุณมีกิจกรรมหลังการสร้าง ไปที่ Build Dependencies> Project Dependencies และตรวจสอบให้แน่ใจว่าถูกต้อง ตรวจสอบลำดับการสร้างโครงการ (แท็บถัดไปสำหรับการอ้างอิง) ด้วย


1

ข้อผิดพลาดนี้เกิดจากหากมีช่องว่างสีขาวที่คัดลอก repo ของคุณ เช่นโครงการของฉันถูกคัดลอกในตำแหน่งด้านล่าง c://projects/My rest project จากนั้นคุณจะเห็นช่องว่างสีขาวที่นั่นหากคุณเปลี่ยนเส้นทาง repo ของคุณไปที่ด้านล่างก็ควรใช้งานได้ c://projects/myrestproject


0

ผมมีปัญหาเหมือนกัน. คุณยังตรวจสอบได้ด้วยว่าเครื่องหมายทับชี้ไปทางใด สำหรับฉันมันใช้งานได้โดยใช้แบ็กสแลชแทนที่จะใช้เครื่องหมายทับ ตัวอย่าง

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

แทน:

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

0

ฉันมีคำสั่งสร้างโพสต์ที่ใช้งานได้ดีก่อนที่ฉันจะอัปเดตใน VS 2017 ปรากฎว่าเครื่องมือ SDK ได้รับการอัปเดตและอยู่ภายใต้เส้นทางใหม่ดังนั้นจึงไม่พบเครื่องมือที่ฉันใช้เพื่อลงนามในแอสเซมบลีของฉัน

สิ่งนี้เปลี่ยนไปจากนี้ ....

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"

สำหรับสิ่งนี้...

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

การเปลี่ยนแปลงที่ละเอียดอ่อนมาก แต่ทำลายดังนั้นตรวจสอบเส้นทางของคุณหลังการอัปเดตหากคุณเห็นข้อผิดพลาดนี้


0

สิ่งที่ต้องระวังก็คือ backslashes คู่ตั้งแต่xcopyไม่ยอมให้พวกเขาในพารามิเตอร์เส้นทางการป้อนข้อมูล ( แต่มันไม่ยอมให้พวกเขาในเส้นทางออก ... )

ใส่คำอธิบายภาพที่นี่


0

หากโซลูชันอื่นอยู่ในโหมดดีบักก่อนอื่นให้หยุดทั้งหมดและหลังจากนั้นรีสตาร์ทวิชวลสตูดิโอ มันได้ผลสำหรับฉัน


0

นอกจากนี้ยังสามารถมาถ้าโฟลเดอร์เป้าหมายจะถูกใช้โดยกระบวนการอื่น ๆ บางส่วน ปิดโปรแกรมทั้งหมดที่อาจใช้โฟลเดอร์เป้าหมายแล้วลอง

คุณอาจใช้การตรวจสอบทรัพยากร (เครื่องมือ windows) เพื่อตรวจสอบกระบวนการที่ใช้โฟลเดอร์เป้าหมายของคุณ

สิ่งนี้ได้ผลสำหรับฉัน!.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.