Kopieren Sie Dateien mit einem Post-Build-Ereignis von einem Projekt in ein anderes… VS2010


132

Ich habe eine Lösung mit 3 Projekten. Ich muss eine Ansicht von einem Projekt in ein anderes kopieren. Ich kann die erstellte DLL über Post-Build-Ereignisse wie folgt kopieren:

Geben Sie hier die Bildbeschreibung ein

Ich möchte also die Datei in Projekt 1 '/Views/ModuleHome/Index.cshtml' in einen Ordner in Projekt 2 kopieren. Wie kopiere ich Dateien über ein Post-Build-Ereignis in mein gewünschtes Projekt? Vielen Dank

Antworten:


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

und wenn Sie ganze Ordner kopieren möchten:

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

Update: Hier ist die Arbeitsversion

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

Hier sind einige häufig verwendete Schalter mit xcopy:

  • / I - Wird beim Kopieren mehrerer Dateien als Verzeichnis behandelt.
  • / Q - Die zu kopierenden Dateien werden nicht angezeigt.
  • / S - Unterverzeichnisse kopieren, sofern nicht leer.
  • / E - Leere Unterverzeichnisse kopieren.
  • / Y - Fordern Sie nicht zum Überschreiben vorhandener Dateien auf.
  • / R - Schreibgeschützte Dateien überschreiben.

2
Ich habe diese Zeile zu meinem Post-Build hinzugefügt und erhalte die Fehlermeldung "Fehler 1 Der Befehl" xcopy "C: \ Benutzer \ tcompton \ Downloads \ MEFMVCPOC \ ModulA \ Ansichten \ ModulAHome \ Index.cshtml" "C: \ Benutzer \ tcompton \ Downloads \ MEFMVCPOC \ MEFMVCPOC \ Views \ ModuleAHome "" mit Code 2 beendet. " Was bedeutet das?
BoundForGlory

Schauen Sie sich das Ausgabefenster an : Ctrl+W+O. Existiert der Views\ModuleAHomeOrdner am Zielspeicherort? Sehen Sie sich das Ausgabefenster für den genauen Befehl an, der ausgeführt wird, und lesen Sie dann die Dokumentation zum Befehl xcopy, um die verschiedenen verfügbaren Schalter zu verstehen : xcopy /?.
Darin Dimitrov

1
Der Ordner 'Views \ ModuleAHome' ist vorhanden, gehört jedoch nicht zum Zielprojekt. Sie müssen also auf 'Alle Dateien anzeigen' klicken, damit er in VS angezeigt wird.
BoundForGlory

1
Ich glaube nicht, dass die Tatsache, dass der Zielordner nicht Teil des Zielprojekts ist, einen Unterschied zu xcopy macht. Dieser Befehl arbeitet direkt mit dem Dateisystem. Wenn es darum geht, diesen Ordner als Teil des Zielprojekts anzuzeigen, ist die Automatisierung dieser Aufgabe möglicherweise schwieriger.
Darin Dimitrov

1
Verstanden ... xcopy "$ (ProjectDir) Views \ ModuleAHome \ Index.cshtml" "$ (SolutionDir) MEFMVCPOC \ Views \ ModuleAHome \" / Y /I. Dieser Artikel half zusammen mit Ihrer Eingabe social.msdn. microsoft.com/Forums/uk/csharpgeneral/thread/…
BoundForGlory

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

Beachten Sie die Anführungszeichen im Quell- und Zielpfad, jedoch nicht im Pfad zur exludelist txt-Datei.

Der Inhalt von ExcludedFilesList.txt lautet wie folgt: .cs \

Ich verwende diesen Befehl, um Dateien von einem Projekt in meiner Lösung in ein anderes zu kopieren und CS-Dateien auszuschließen.

/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.

Danke dir. Das / exclude: funktioniert nach dem Hinzufügen von Anführungszeichen zu your-source-pathund your-destination-path. Ohne diese Anführungszeichen funktioniert es überhaupt nicht.
AechoLiu

@AechoLiu Die Anführungszeichen sind immer erforderlich, wenn Ihr Dateipfad Leerzeichen enthält, z "My File.txt".
Felipe Romero

14

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

/ F - Zeigt die vollständigen Namen der Quell- und Zieldateien an

/ R - Hiermit werden schreibgeschützte Dateien überschrieben

/ Y - Unterdrückt die Aufforderung, eine oder mehrere vorhandene Dateien zu überschreiben.

/ I - Nimmt an, dass das Ziel ein Verzeichnis ist (muss aber mit enden)

Ein kleiner Trick - im Ziel müssen Sie mit dem Zeichen \ enden, um xcopy mitzuteilen, dass das Ziel ein Verzeichnis und keine Datei ist!


8

Rufen Sie die BatchDatei auf, die Xcopyfür die erforderliche Datei von Quelle zu Ziel ausgeführt wird

call "$(SolutionDir)scripts\copyifnewer.bat"

7

Ich benutze es so.

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

Beachten Sie die Verwendung dieser. $ (TargetDir) hat bereits '\' "D: \ MyProject \ bin \" = $ (TargetDir)

Sie finden das Makro im Befehlseditor

Geben Sie hier die Bildbeschreibung ein


1
@ HarshilDoshi Projekt → Projekteigenschaft → Ereignisse erstellen → PostBuildEvent
Polluks

3

Dieser Befehl wirkt für mich wie ein Zauber:

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

Es rekursiv kopiert alle dllund exeDatei aus MySolutionPath\librariesin die bin\debugoderbin\release .

Weitere Informationen finden Sie hier


2

Wie in den vorherigen Antworten schlage ich auch vor xcopy. Ich möchte jedoch die Antwort von Hallgeir Engen mit dem /excludeParameter ergänzen . Es scheint einen Fehler mit dem Parameter zu geben, der verhindert, dass er mit Pfadnamen arbeitet, die lang sind oder Leerzeichen enthalten, da Anführungszeichen nicht funktionieren. Die Pfadnamen müssen im "DOS" -Format vorliegen, wobei "Dokumente" in "DOCUME ~ 1" übersetzt werden (laut dieser Quelle) ).

Also, wenn Sie die \ ausschließen Parameter verwenden möchten, gibt es eine Abhilfe hier :

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

Beachten Sie, dass die Quell- und Zielpfade in Anführungszeichen stehen können (und sollten, wenn sie Leerzeichen enthalten), nicht jedoch der Pfad zur Ausschlussdatei.


2

Wenn Sie die Plattform (x64, x86 usw.) und die Konfiguration (Debug oder Release) berücksichtigen möchten, wäre dies ungefähr so:

xcopy "$(SolutionDir)\$(Platform)\$(Configuration)\$(TargetName).dll" "$(SolutionDir)TestDirectory\bin\$(Platform)\$(Configuration)\" /F /Y 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.