Po pierwsze, zdaję sobie sprawę z tego, że jest mnóstwo podobnych pytań i wiem, że musiałem próbować przystosować co najmniej 5 z nich, ale wciąż tu pytam, ponieważ mam brzydkie pojęcie o CMD (które, jak sądziłem, było dobre aż do tego momentu) frustruje mnie ogólnymi, niepomyślnymi błędami i nie mogę zrozumieć, jaka część składni jest błędna. Jest to prawdopodobnie spowodowane faktem, że inne pytania dotyczą struktur folderów / nazw plików ich odpowiednich OP, a kiedy próbuję dostosować kod do mojej własnej struktury folderów / plików, odmawia on pracy. Dlatego pytam o CMD for
rozwiązanie pętli, które będzie działało dla mojej własnej struktury plików i folderów.
Mam folder nadrzędny, który zawiera wiele innych folderów, w których znajdują się pliki:
Parent Folder
Subfolder
File1
File2
Subfolder
File1
File2
Subfolder
File1
File2
...i tak dalej.
Chcę użyć CMD for
pętla w połączeniu z move
polecenie wyodrębnienia wszystkich plików z podfolderów do folderu nadrzędnego, pozostawiając każdy podfolder pusty.
Podając CMD for
pętla proszę rozbić to, co robi każda część polecenia, ponieważ pomoże to upewnić się, że rozumiem kod i mam nadzieję, że zminimalizuję problemy, które sprawiają, że kod działa dla mnie.
dir /s/b >a.a
aby uzyskać listę wszystkich plików, po jednym w wierszu. Wtedy tymove
na początku każdej linii ic:\blah\myparentfolder
na końcu każdej linii masz listę poleceń i możesz nazwać plik blah.bat i uruchomić goOdpowiedzi:
W porządku, w końcu to zrozumiałem, dostosowując kod z jeszcze jednego pytania. Dzięki @AFH za wyjaśnienie części, których nie byłem pewien w komentarzach do tej odpowiedzi, i za jego ogólną pomoc z tym - jest to bardzo doceniane.
Aby wyodrębnić wszystkie pliki z podfolderów do ich folderu nadrzędnego
for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER"
Pamiętaj, aby zastąpić wszystkie wystąpienia
PARENTFOLDER
ze ścieżką do folderu, do którego chcesz wyodrębnić pliki.Aby wyodrębnić wszystkie pliki z podfolderów i Usuń puste podfoldery
Jest mało prawdopodobne, że będziesz musiał pozostawić puste podfoldery po wyodrębnieniu z nich plików - na pewno nie - więc poniższe polecenie automatyzuje ich usuwanie.
for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER" && cd "PARENTFOLDER" && for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"
Ponownie zastąp wszystkie wystąpienia
PARENTFOLDER
ze ścieżką do folderu, do którego chcesz wyodrębnić pliki.W tym momencie jednak nie jest to już jeden liner i zaczyna się nieco kręcić po wklejeniu do wiersza poleceń, więc łatwiej jest po prostu umieścić całość w pliku wsadowym. Używanie zmiennych do ścieżki do folderu nadrzędnego pozwala zastąpić tylko jedną instancję
PARENTFOLDER
na początku pliku i jest to również bezpieczniejsza opcja, zapobiegająca przypadkowemu usunięciu pustych folderów, które warto zachować.Plik wsadowy
Wklej do pliku tekstowego, zastąp
PARENTFOLDER
ze ścieżką do folderu, z którym chcesz pracować, i zapisz go za pomocą.bat
rozbudowa. Uruchom w dowolnym katalogu.źródło
for
składnia komendy nie jest racjonalna, ale pierwsza%d
definiujed
jako zmienna pętli i druga%d
jest tym, do czego zmienna pętli rozszerza się przy każdym przejściu pętli (składnia Uniksa jest bardziej racjonalna:for ... d in ... do ...
). Pierwsza instancja nie jest rozwijana, więc nie wymaga cytowania, inaczej niż podo
, gdzie%d
może rozwinąć się do nazw plików z osadzonymi spacjami. Nie ma w tym nic specjalnegod
: można użyć dowolnej pojedynczej litery, aled
jest logiczny dla katalogów (lubf
dla plików). Jeszcze bardziej irracjonalnie%%d
musi być używany w partii (.cmd
lub.bat
) plik.for
, wzdłuż liniifor /d %d in (PARENTFOLDER\*) do for /r "%d" %f in (*.*) do move "%f" TARGETLOCATION
. Jeśli uwzględnisz dodatkowe wymagania w swoim pytaniu, prześlę odpowiedź na korzyść innych.PARENTFOLDER
zawiera spacje, należy je zacytować. Proponuję, żebyś to zrobiłecho
między pierwszymdo
i drugifor
, aby dokładnie sprawdzić, co zagnieżdżonofor
komenda zostanie wykonana. Twoje warunki mają tak wiele możliwych wariantów, że nie mogę tutaj ustawić reprezentatywnego testu.PARENTFOLDER
i to jest coś takiegoname with spaces
, pierwszyfor
oceni jakofor /d %d in (name with spaces\*) do ...
, więcd
stanie się sukcesywniename
,with
, a następnie wszelkie pliki pasujące do maskispaces\*
. Nawiasy nie kończą wymogu cytowania. Nie musisz cytować tylko razcd
polecenie, które przyjmuje resztę linii jako pojedynczy parametr, w tym wszelkie spacje (choćTab
rozszerzenia wstawia cytaty);md
ird
może działać w wielu katalogach, więc trzeba cytować, jeśli nazwy mają spacje.