Gewinnen Sie eine teilweise XCOPY-Erweiterungsübereinstimmung

581
Petr Vepřek

Es gibt eine Datei, die README.cppcleanin einer Verzeichnishierarchie benannt ist. Ich möchte alle *.cppDateien aus dem Verzeichnisbaum kopieren, nicht jedoch die *.cppcleanDatei.

Alle folgenden Befehle kopieren die .cppclean-Datei:

xcopy /s /f ..\dirtree\*.cpp xcopy /s /f "..\dirtree\*.cpp " xcopy /s /f ..\dirtree\*.cpp. xcopy /s /f "..\dirtree\*.cpp. " 

Interessanterweise kopieren Befehle unten nicht:

xcopy /s /f ..\dirtree\*.c xcopy /s /f ..\dirtree\*.cp xcopy /s /f ..\dirtree\*.cppc xcopy /s /f ..\dirtree\*.cppcl xcopy /s /f ..\dirtree\*.cppcle xcopy /s /f ..\dirtree\*.cppclea 

Na sicher

xcopy /s /f ..\dirtree\*.cppclean 

kopiert auch die .cppclean-Datei.

FRAGE: Wie kopiere ich alle *.cpp(aber nicht *.cppclean) Dateien mit XCOPY? (Ich möchte die .cppclean-Datei nicht explizit ausschließen, da im Allgemeinen andere Dateien wie diese vorhanden sein könnten.)

0

2 Antworten auf die Frage

1
Keltari

Verwenden Sie das /EXCLUDE:Argument. `/ EXCLUDE erwartet eine Datei mit einer Liste ausgeschlossener Dateien.

Erstellen Sie also eine Datei namens "excludedfileslist.txt", die Folgendes enthält:

.cppclean

Dann benutze einen Befehl wie diesen:

xcopy / s / f /exclude: exkludierteDateiliste.txt .. \ dirtree \ cpp

Ja, das funktioniert und danke. Ich möchte jedoch, dass xcopy mit der genauen Erweiterung übereinstimmt (in diesem Fall cpp). Ich hoffe also auf etwas allgemeineres (als das explizite Ausschließen einiger Dateien). Deshalb habe ich nach der Erweiterung versucht, ein Leerzeichen anzufassen (mit Anführungszeichen), aber dieses muss entfernt werden und hilft nicht. PS: Würde .cppclean auch .cppclean.cpp ausschließen? Es scheint, als würde es ... Petr Vepřek vor 6 Jahren 0
1
Pimp Juice IT

Da Sie in einem Kommentar klargestellt haben, dass Sie unerwünschte Dateierweiterungen, die nicht kopiert werden sollen, nicht explizit ausschließen möchten und eine Methode bevorzugen würden, bei der nur die Dateien mit der gewünschten Erweiterung kopiert werden, stelle ich Ihnen nachfolgend eine detaillierte Lösung vor .

Im Wesentlichen dieser Wille. . .

  • Verwenden Sie ein FOR / F using TOKENS=*und den Befehl dir mit den Schaltern /sund /b, um die Verzeichnisse mit den .cppDateien zu durchsuchen, die rekursiv kopiert werden.

  • Verwenden Sie von dort aus die bedingte IF- Logik, um zu überprüfen, ob die Dateierweiterung tatsächlich nur durch die Batch-Variablen ersetzt wird. .cppWenn dies der Fall ist, werden nur diese Dateien für jede Iteration der Schleife kopiert

  • Der letzte XCOPYBefehl wird XCOPY /s /f "%Src%\*%~nxF" "%Dst%so sein, dass er immer noch die expliziten Dateinamen aus dem DIRBefehl erhält, jedoch mit dem Sternchen-Platzhalterzeichen vor dem Befehl. Die bedingte Logik gewährleistet jedoch, dass keine anderen Dateien kopiert werden

Befehlszeile

Hinweis: Stellen Sie die Variablenwerte source ( Src=) und destination ( Dst=) für Ihre Anforderungen ein

SET Src=C:\Users\User\Desktop\CPP SET Dst=C:\CPP2 FOR /F "TOKENS=*" %F IN ('dir /s /b "%Src%\*.cpp"') DO IF %~xF==.cpp ECHO F | XCOPY /s /f "%Src%\*%~nxF" "%Dst%\" 

Weitere Ressourcen

  • FOR / F

    • FOR /?

       tokens=x,y,m-n - specifies which tokens from each line are to be passed to the for body for each iteration. This will cause additional variable names to be allocated. The m-n form is a range, specifying the mth through the nth tokens. If the last character in the tokens= string is an asterisk, then an additional variable is allocated and receives the remaining text on the line after the last token parsed. 

      Darüber hinaus wurde die Ersetzung von FOR-Variablenreferenzen verbessert. Sie können jetzt die folgende optionale Syntax verwenden:

      %~xI - expands %I to a file extension only 
  • DIR

  • OB
Danke für deine Antwort. Ich glaube, ich habe erwähnt, dass ich einige Dateien in der ursprünglichen Frage (und später im Kommentar) nicht explizit ausschließen möchte. Ich mag Ihren Vorschlag, weil er keinen "unerwünschten Dateiausschluss" erfordert. Ich finde jedoch ein Problem damit. Die Verzeichnisstruktur, aus der Dateien kopiert werden, wird nicht repliziert. Alle Dateien befinden sich im selben Zielverzeichnis. (NB mit% ~ pF als Teil der Zielspezifikation hilft nicht, da dir / s den gesamten Pfad jeder Datei bis zum Laufwerksbuchstaben aufführt. Es sind einige weitere Manipulationen erforderlich ...) Petr Vepřek vor 6 Jahren 0
@ PetrVepřek Guter Punkt, ich habe das vermisst, da mein kleiner Test mit Dateien in separaten Unterordnern mit den gleichen Dateinamen war. Ich habe es nicht bemerkt, da beim Testen alle Strukturen und Dateien vorhanden waren. Ich glaube, ich habe einen Weg gefunden, der hier funktionieren wird: https://justpaste.it/1fu3i, aber ich möchte meine Antwort erst bearbeiten, wenn ich versichere, dass es eine Lösung ist, die zu 100% für Sie funktioniert. Ich habe gerade die Befehlszeilenlogik in diese Verknüpfung kopiert, aber ich habe ein Ziel und einen Quellpfad explizit festgelegt. Wenn Sie im Wesentlichen einen Platzhalter "*" an "% ~ nxF" anhängen und "% Src% \" davor setzen, wird das erwartete Ergebnis erzielt. Pimp Juice IT vor 6 Jahren 0
Der abschließende `XCOPY`-Befehl sieht also in etwa wie 'XCOPY / s / f"% Src% \ *% ~ nxF ""% Dst% "aus, sodass er immer noch den expliziten Namen mit den Sternchen-Platzhaltern davor und dem Bedingte Logik sorgt trotzdem dafür, dass keine anderen Dateien als ".CPP" genannte Dateien kopiert werden. Ich hoffe, das hilft Ihnen und wenn ja, werde ich meine Antwort entsprechend aktualisieren. Pimp Juice IT vor 6 Jahren 1
@ PetrVepřek Ich habe eine andere Idee, ob das nicht ausreicht, sondern nur neugierig ist, ob die schnell angepasste Lösung ausreichen würde oder nicht, aber ich habe eine andere Sache, die ich testen werde, wenn dies nicht hilft oder ein Problem verursacht, das auf doppelten oder ähnlichen übereinstimmenden Dateinamen beruht. Pimp Juice IT vor 6 Jahren 0
Gutes Timing! :-) Ich war ein paar Tage vom Startplatz entfernt und kam gerade zurück, sah Ihren Kommentar und tat es tatsächlich, als Ihr Folgekommentar kam. In meinem winzigen Test funktionierte Ihr Vorschlag wie erwartet. Nett! Aber denken Sie daran, ich habe es noch nicht gründlich getestet. Petr Vepřek vor 6 Jahren 0
@ PetrVepřek Ah .... Keine Sorge, ich freue mich trotzdem, von dir zu hören. Nehmen Sie sich Zeit und seien Sie sicher damit. Schlagen Sie mich zurück, wenn Sie sich so oder so auskennen, und ich warte auf Ihr Ergebnis und Ihr Ergebnis. Pimp Juice IT vor 6 Jahren 0
Bisher funktioniert deine Lösung für mich. Wenn Sie Ihre Antwort aktualisieren, werde ich sie akzeptieren. (Ich wünschte, es gäbe eine Möglichkeit, die Tatsache zu "reparieren / umgehen", dass xcopy nicht wie erwartet mit der Quellerweiterung übereinstimmt, dh * .cpp kopiert * .cpp- und * .cppclean-Dateien, während * .ccp auch nicht kopiert es wäre auf einen Schlag schneller als iterieren ... Allerdings ist iterieren besser als unerwartete Ergebnisse. :-) Petr Vepřek vor 6 Jahren 0
@ PetrVepřek Ich habe meine Antwort so aktualisiert, wie Sie es gewünscht haben. Pimp Juice IT vor 6 Jahren 0