คัดลอกไฟล์จากโปรเจ็กต์หนึ่งไปยังอีกโปรเจ็กต์หนึ่งโดยใช้โพสต์บิลด์เหตุการณ์ ... VS2010


140

ฉันมีวิธีแก้ปัญหากับ 3 โครงการในนั้น ฉันต้องการคัดลอกมุมมองจากโครงการหนึ่งไปยังอีกโครงการหนึ่ง ฉันสามารถคัดลอก DLL ที่สร้างขึ้นผ่านกิจกรรมการสร้างโพสต์ดังนี้:

ป้อนคำอธิบายภาพที่นี่

ดังนั้นฉันต้องการคัดลอกไฟล์ในโปรเจ็กต์หนึ่ง '/Views/ModuleHome/Index.cshtml' ไปยังโฟลเดอร์ในโปรเจ็กต์ 2 ฉันจะคัดลอกไฟล์ไปยังโปรเจ็กต์ที่ต้องการผ่านเหตุการณ์หลังการสร้างได้อย่างไร ขอบคุณ

คำตอบ:


319
xcopy "$(ProjectDir)Views\Home\Index.cshtml" "$(SolutionDir)MEFMVCPOC\Views\Home"

และหากคุณต้องการคัดลอกโฟลเดอร์ทั้งหมด:

xcopy /E /Y "$(ProjectDir)Views" "$(SolutionDir)MEFMVCPOC\Views"

อัปเดต: นี่คือเวอร์ชันที่ใช้งานได้

xcopy "$(ProjectDir)Views\ModuleAHome\Index.cshtml" "$(SolutionDir)MEFMVCPOC\Views\ModuleAHome\" /Y /I

นี่คือสวิตช์ที่ใช้กันทั่วไปกับxcopy:

  • / i - ถือว่าเป็นไดเร็กทอรีหากคัดลอกไฟล์หลายไฟล์
  • / Q - อย่าแสดงไฟล์ที่กำลังคัดลอก
  • / S - คัดลอกไดเรกทอรีย่อยเว้นแต่จะว่างเปล่า
  • / E - คัดลอกไดเรกทอรีย่อยที่ว่างเปล่า
  • / Y - อย่าแจ้งให้เขียนทับไฟล์ที่มีอยู่
  • / R - เขียนทับไฟล์แบบอ่านอย่างเดียว

3
ฉันเพิ่มบรรทัดนี้ในการสร้างโพสต์ของฉันและฉันได้รับข้อผิดพลาดนี้ "Error 1 The command" xcopy "C: \ Users \ tcompton \ Downloads \ MEFMVCPOC \ ModuleA \ Views \ ModuleAHome \ Index.cshtml" "C: \ Users \ tcompton \ ดาวน์โหลด \ MEFMVCPOC \ MEFMVCPOC \ Views \ ModuleAHome "" ออกด้วยรหัส 2 " สิ่งนี้หมายความว่า?
BoundForGlory

ดูที่หน้าต่างผลลัพธ์: Ctrl+W+O. มีViews\ModuleAHomeโฟลเดอร์อยู่ที่ตำแหน่งเป้าหมายหรือไม่ ดูที่หน้าต่างการแสดงผลสำหรับคำสั่งที่ถูกต้องถูกดำเนินการแล้วอ่านเอกสารสำหรับคำสั่ง xcopy xcopy /?จะเข้าใจสวิทช์ที่แตกต่างกันที่มีอยู่:
Darin Dimitrov

1
โฟลเดอร์ 'Views \ ModuleAHome' มีอยู่ แต่ไม่ใช่ส่วนหนึ่งของโปรเจ็กต์เป้าหมายหมายความว่าคุณต้องคลิก 'แสดงไฟล์ทั้งหมด' เพื่อให้มันปรากฏใน VS
BoundForGlory

1
ฉันไม่คิดว่าความจริงที่ว่าโฟลเดอร์ปลายทางไม่ได้เป็นส่วนหนึ่งของโปรเจ็กต์ปลายทางสร้างความแตกต่างให้กับ xcopy คำสั่งนี้ทำงานโดยตรงกับระบบไฟล์ เท่าที่ทำให้โฟลเดอร์นี้ปรากฏเป็นส่วนหนึ่งของโปรเจ็กต์ปลายทางการทำให้งานนี้เป็นไปโดยอัตโนมัติอาจทำได้ยากขึ้น
Darin Dimitrov

1
เข้าใจแล้ว ... xcopy "$ (ProjectDir) Views \ ModuleAHome \ Index.cshtml" "$ (SolutionDir) MEFMVCPOC \ Views \ ModuleAHome \" / Y /I ... บทความนี้ช่วยในการป้อนข้อมูลของคุณsocial.msdn microsoft.com/Forums/uk/csharpgeneral/thread/…
BoundForGlory

21
xcopy "your-source-path" "your-destination-path" /D /y /s /r /exclude:path-to-txt- file\ExcludedFilesList.txt

สังเกตเครื่องหมายคำพูดในเส้นทางต้นทางและเส้นทางปลายทาง แต่ไม่อยู่ในเส้นทางไปยังไฟล์ txt exludelist

เนื้อหาของ ExcludedFilesList.txt มีดังต่อไปนี้: .cs \

ฉันใช้คำสั่งนี้เพื่อคัดลอกไฟล์จากโครงการหนึ่งในโซลูชันของฉันไปยังอีกโครงการหนึ่งและไม่รวมไฟล์. cs

/D Copy only files that are modified in sourcepath
/y Suppresses prompting to confirm you want to overwrite an existing destination file.
/s Copies directories and subdirectories except empty ones.
/r Overwrites read-only files.

ขอบคุณ. กระบวนการ / ไม่รวม: งานหลังจากที่เพิ่มคำพูดไปและyour-source-path your-destination-pathหากไม่มีคำพูดเหล่านั้นก็ไม่ได้ผลเลย
AechoLiu

คำพูด @AechoLiu "My File.txt"มีความจำเป็นเสมอถ้าเส้นทางของไฟล์ของคุณมีเช่นพื้นที่ว่าง
Felipe Romero

14

xcopy "$ (TargetDir) * $ (TargetExt)" "$ (SolutionDir) \ Scripts \ MigrationScripts \ Library \" / F / R / Y / I

/ F - แสดงชื่อไฟล์ต้นทางและเป้าหมายแบบเต็ม

/ R - จะเขียนทับไฟล์แบบอ่านอย่างเดียว

/ Y - ระงับการแจ้งให้เขียนทับไฟล์ที่มีอยู่

/ I - ถือว่าปลายทางคือไดเร็กทอรี (แต่ต้องลงท้ายด้วย)

เคล็ดลับเล็กน้อย - ในเป้าหมายคุณต้องลงท้ายด้วยอักขระ \ เพื่อบอก xcopy ว่าเป้าหมายคือไดเร็กทอรีไม่ใช่ไฟล์!



8

ผมใช้แบบนี้

xcopy "$(TargetDir)$(TargetName).dll" "$(SolutionDir)Lib\TIRM\x86\" /F /Y 
xcopy "$(TargetDir)$(TargetName).lib" "$(SolutionDir)Lib\TIRM\x86\" /F /Y 


/F : Copy source is File   
/Y : Overwrite and don't ask me

สังเกตการใช้สิ่งนี้ $ (TargetDir) มี '\' "D: \ MyProject \ bin \" = $ (TargetDir) แล้ว

คุณสามารถค้นหามาโครได้ในตัวแก้ไขคำสั่ง

ป้อนคำอธิบายภาพที่นี่


1
@HarshilDoshi Project → Project Property → Build Events → PostBuildEvent
Polluks

3

คำสั่งนี้ใช้งานได้ดีสำหรับฉัน:

for /r "$(SolutionDir)libraries" %%f in (*.dll, *.exe) do @xcopy "%%f" "$(TargetDir)"

มันซ้ำสำเนาทุกdllและexeไฟล์MySolutionPath\librariesลงในหรือbin\debugbin\release

คุณสามารถดูข้อมูลเพิ่มเติมได้ที่นี่


2

เช่นเดียวกับคำตอบก่อนหน้านี้ฉันก็แนะนำxcopyเช่นกัน อย่างไรก็ตามฉันต้องการเพิ่มคำตอบของ Hallgeir Engen ด้วย/excludeพารามิเตอร์ ดูเหมือนว่าจะมีข้อผิดพลาดที่พารามิเตอร์ทำให้ไม่สามารถทำงานกับชื่อพา ธ ที่ยาวหรือมีช่องว่างเนื่องจากเครื่องหมายคำพูดจะไม่ทำงาน ชื่อพา ธ ต้องอยู่ในรูปแบบ "DOS" ที่มี "เอกสาร" แปลเป็น "DOCUME ~ 1" (ตามแหล่งที่มานี้ )

ดังนั้นหากคุณต้องการใช้พารามิเตอร์ \ exclude มีวิธีแก้ปัญหาที่นี่ :

cd $(SolutionDir)
xcopy "source-relative-to-path-above" "destination-relative-to-path-above
/exclude:exclude-file-relative-path

โปรดสังเกตว่าเส้นทางต้นทางและปลายทางสามารถ (และควรมีช่องว่างหากมี) อยู่ในเครื่องหมายคำพูด แต่ไม่ใช่เส้นทางไปยังไฟล์ที่แยกออก


1

หากคุณต้องการพิจารณาแพลตฟอร์ม (x64, x86 ฯลฯ ) และการกำหนดค่า (Debug หรือ Release) จะเป็นดังนี้:

xcopy "$(SolutionDir)\$(Platform)\$(Configuration)\$(TargetName).dll" "$(SolutionDir)TestDirectory\bin\$(Platform)\$(Configuration)\" /F /Y 

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