Wygraj 10 częściowych rozszerzeń XCOPY

0

W README.cppcleanhierarchii katalogów znajduje się plik o nazwie . Chcę skopiować wszystkie *.cpppliki z drzewa katalogów, ale nie *.cppcleanplik.

Wszystkie poniższe polecenia kopiują plik .cppclean:

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

Co ciekawe, poniższe polecenia nie kopiują:

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

Oczywiście

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

kopiuje również plik .cppclean.

PYTANIE: Jak skopiować wszystkie *.cpp(ale nie *.cppclean) pliki przy użyciu XCOPY? (Nie chcę jawnie wykluczać pliku .cppclean, ponieważ w ogólnym przypadku mogą istnieć inne podobne pliki).

Petr Vepřek
źródło

Odpowiedzi:

1

Ponieważ w komentarzu wyjaśniłeś, że wolisz nie wykluczać jawnie niektórych niechcianych rozszerzeń plików, których nie chcesz kopiować, i wolisz metodę, która kopiuje tylko pliki z rozszerzeniem określonym przez Ciebie, poniżej przedstawię szczegółowe rozwiązanie .

Zasadniczo tak będzie. . .

  • Użyj polecenia FOR / F używając TOKENS=*i polecenia dir za pomocą przełączników /si /b, aby przeglądać katalogi z .cppplikami rekurencyjnie, które zostaną skopiowane.

  • Stamtąd użyj warunkowej logiki IF, aby sprawdzić za pomocą podstawień zmiennych wsadowych, czy rozszerzenie pliku jest rzeczywiście tylko .cppi jeśli to prawda, skopiuje tylko te pliki na każdą iterację pętli

  • Ostateczne XCOPYpolecenie będzie XCOPY /s /f "%Src%\*%~nxF" "%Dst%tak, aby nadal pobierało jawne nazwy plików z DIRpolecenia, ale z gwiazdką przed nim, jednak logika warunkowa nadal zapewnia, że ​​nie zostaną skopiowane żadne inne pliki oprócz plików o nazwie .CPP

Wiersz poleceń

Uwaga: Ustaw odpowiednio wartości zmiennych source ( Src=) i destination ( Dst=)

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%\"

Dalsze zasoby

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

      Ponadto ulepszono podstawianie odwołań do zmiennych FOR. Możesz teraz użyć następującej opcjonalnej składni:

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

  • JEŚLI
Pimp Juice IT
źródło
Dzięki za odpowiedź. Wydaje mi się, że wspomniałem, że nie chcę „wyraźnie wykluczać” niektórych plików w pierwotnym pytaniu (i później w komentarzu). Podoba mi się twoja propozycja, ponieważ nie wymaga „niepożądanego wykluczenia pliku”. Mam jednak z tym jeden problem. Struktura katalogów, z których kopiowane są pliki, nie jest replikowana. Wszystkie pliki trafiają do tego samego katalogu docelowego. (Uwaga: użycie% ~ pF jako części specyfikacji miejsca docelowego nie pomaga, ponieważ katalog / s wyświetla całą ścieżkę każdego pliku od litery dysku. Wymagana jest dodatkowa manipulacja ...)
Petr Vepřek
@ PetrVepřek Dobrze, że tęskniłem za tym, ponieważ mój mały test dotyczył plików w osobnych podfolderach o tych samych nazwach, więc nie zauważyłem, ponieważ wszystkie struktury i pliki były na miejscu podczas testowania. Wydaje mi się, że wymyśliłem sposób, który zadziała tutaj: justpaste.it/1fu3i, ale nie chcę edytować mojej odpowiedzi, dopóki nie potwierdzę, że jest to rozwiązanie, które działa w 100% dla Ciebie. Właśnie skopiowałem logikę wiersza poleceń do tego łącza, którego użyłem, ale wyraźnie ustawiam miejsce docelowe i ścieżkę źródłową. Zasadniczo dodanie symbolu wieloznacznego *do %~nxFi umieszczenie przed nim `% Src%` daje oczekiwany wynik.
Pimp Juice IT
1
Ostateczne XCOPYpolecenie wygląda XCOPY /s /f "%Src%\*%~nxF" "%Dst%więc tak, że nadal otrzymuje jawną nazwę z gwiazdką przed nią, a logika warunkowa nadal gwarantuje, że nie .CPPzostaną skopiowane żadne pliki inne niż tylko pliki nazwane. Mam nadzieję, że to ci pomoże, a jeśli tak, odpowiednio zaktualizuję swoją odpowiedź.
Pimp Juice IT
@ PetrVepřek Mam inny pomysł, jeśli to nie wystarczy, ale po prostu jestem ciekawy, czy wystarczy szybko dostosowane rozwiązanie, ale mam jeszcze jedną rzecz, którą przetestuję, jeśli to nie pomoże lub spowoduje problem na podstawie duplikatów lub podobnych pasujących nazw plików.
Pimp Juice IT
Dobre wyczucie czasu! :-) Byłem poza planem na kilka dni i właśnie wróciłem, zobaczyłem twój komentarz, i faktycznie spróbowałem, kiedy nadszedł twój komentarz uzupełniający. W moim drobnym teście twoja propozycja działała zgodnie z oczekiwaniami. Miły! Pamiętaj jednak, że nie przetestowałem go jeszcze dokładnie.
Petr Vepřek
1

Użyj /EXCLUDE:argumentu. `/ EXCLUDE oczekuje pliku zawierającego listę plików wykluczonych.

Stwórz więc plik o nazwie „disabledfileslist.txt” zawierający:

.cppclean

Następnie użyj następującego polecenia:

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

Keltari
źródło
Tak, to działa i dziękuję. Chciałbym jednak, aby xcopy dokładnie pasowało do rozszerzenia (w tym przypadku cpp). Mam więc nadzieję na coś bardziej ogólnego (niż jawne wykluczenie niektórych plików). Dlatego próbowałem przyczepić spację po rozszerzeniu (używając cudzysłowów), ale to musi zostać usunięte i to nie pomaga. PS: Czy .cppclean wyklucza również .cppclean.cpp? Wygląda na to, że ...
Petr Vepřek