2012-01-28 63 views
10

Tôi có một dòng lệnh mà các bản sao tập tin từ thư mục A đến thư mục B:Vòng lặp Foreach trên cửa sổ dòng lệnh?

copy A\* B\ 

bây giờ tôi muốn xóa tất cả các file trong B có mặt trong A, không đệ quy. Tôi có thể liệt kê các tập tin trong một như thế này:

dir /b /a-d A 

Với đầu ra hạnh phúc:

f0.txt 
f1.txt 
f2.txt 

Dưới đây là mã giả cho những gì tôi muốn làm:

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

Có một cửa sổ dòng lệnh cú pháp mà sẽ thực hiện một lệnh, bằng cách sử dụng đầu ra của lệnh khác như là một đầu vào? Tôi biết về toán tử đường ống (|) nhưng không biết cách nào có thể được sử dụng để thực hiện nhiệm vụ này. Bất kỳ trợ giúp sẽ được đánh giá cao.

Hạn chế: Chỉ lệnh sẵn theo mặc định trong Windows 7.

Trả lời

12

Bạn có thể duyệt qua các tập tin với

for %x in (*) do ... 

mà cũng là rất nhiều mạnh mẽ hơn cố gắng để lặp qua các sản phẩm của một lệnh cho trường hợp sử dụng này.

Vì vậy

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

hoặc, nếu bạn cần điều này trong một tập tin thực thi thay vì dòng lệnh:

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

%~nxf lợi nhuận chỉ có tên file và phần mở rộng của mỗi tập tin vì nó sẽ được có tiền tố là A\ và bạn muốn xóa nó trong B.

Thêm > nul 2>&1 để chặn bất kỳ đầu ra nào (thông báo lỗi có thể xuất hiện khi yo u thử xóa các tập tin không tồn tại).


Chỉ cần cho đầy đủ, bạn có thể trên thực tế lặp qua các sản phẩm của một lệnh trong gần như cùng một cách:

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

nhưng có một số vấn đề với việc này và trong trường hợp của iterating trên dir đầu ra nó hiếm khi cần thiết, do đó tôi không khuyên bạn nên nó.


Và kể từ khi bạn đang trên Windows 7, bạn có PowerShell cũng như:

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

hoặc ngắn hơn:

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

bạn có thể thêm '-erroraction Silentlycontinue' để tránh những sai sót khi một số tệp trong A không tồn tại trong B – mjsr

Các vấn đề liên quan