2012-01-28 15 views
10

Mam wiersza polecenia, które pliki z folderu A kopiuje do folderu B:Pętla Foreach na linii poleceń Windows?

copy A\* B\ 

Chciałbym teraz usunąć wszystkie pliki w B, które są obecne w A, non-rekurencyjnie. Mogę wymienić pliki w ten sposób:

dir /b /a-d A 

Z istoty wyjściowa:

f0.txt 
f1.txt 
f2.txt 

Oto pseudokod za co chciałbym zrobić:

foreach $1 in <dir /b /a-d A output>: 
    del B\$1 

Czy istnieje składnia wiersza poleceń systemu Windows, która wykona polecenie, używając wyjścia innego polecenia jako danych wejściowych? Zdaję sobie sprawę z operatora instalacji rurowej (|), ale nie wiem, w jaki sposób można go wykorzystać do wykonania tego zadania. Każda pomoc będzie doceniona.

Ograniczenie: Tylko poleceń dostępny domyślnie w systemie Windows 7.

Odpowiedz

12

Można iteracyjne nad pliki

for %x in (*) do ... 

który jest również dużo bardziej wytrzymałe niż próby iteracyjne nad wyjściem z poleceniem ten przypadek użycia.

Więc

for %f in (A\*) do del "B\%~nxf" 

lub, jeśli trzeba to w pliku wsadowym zamiast linii poleceń: Tylko

for %%f in (A\*) do del "B\%%~nxf" 

%~nxf zwraca nazwę pliku i rozszerzenia każdego pliku, ponieważ będzie z prefiksem A\ i chcesz go usunąć w B.

Dodaj > nul 2>&1, aby wyłączyć dowolne wyjście (komunikaty o błędach mogą pojawić się, gdy yo próbujesz usunąć pliki, które nie istnieją).


Tylko dla kompletności, można w rzeczywistości iteracyjne nad wyjściem z komendy w prawie taki sam sposób:

for /f %x in ('some command') do ... 

ale istnieje kilka problemów z tego, i w przypadku iteracji nad dir wyjście jest rzadko konieczne, dlatego nie polecam go.


A skoro jesteś na Windows 7, trzeba PowerShell, a także:

Get-ChildItem A\* | ForEach-Object { Remove-Item ('B\' + $_.Name) } 

lub krócej:

ls A\* | % { rm B\$($_.Name) } 
+1

można dodać '-erroraction Silentlycontinue' aby uniknąć błędów podczas jakiś plik w A nie istnieje w B – mjsr