2012-04-18 22 views
11

Tôi đang cố thay đổi tất cả tên tệp trong thư mục hiện tại và tôi đang cố gắng thực hiện điều này bằng cách xóa tiền tố tệp (mỗi tệp có tiền tố chung) hoặc thay đổi tên của họ để đếm của họ (nếu có 5 tập tin, tên tập tin sẽ được 1.txt 2.txt 3.txt 4.txt 5.txt).Đổi tên (hoặc xóa tiền tố) nhiều tệp cho mỗi số

Bây giờ tôi đã tìm thấy lệnh ren trong cmd và chơi với nó một chút nhưng cho đến nay tôi đã không thể đạt được kết quả và tôi chỉ có thể chạy điều này trong cmd, do đó không có tập tin batch có thể được sử dụng.

này là gần nhất mà tôi nhận được, nhưng nó chỉ bổ sung thêm một tiền tố:

FOR %f IN (*.*) DO ren %f prefix%f 

Tôi đã cố gắng làm điều ngược lại:

FOR %f IN (*.*) DO ren prefix%f %f 

Nhưng tất nhiên, đã không làm việc vì vậy tôi bây giờ yêu cầu giúp đỡ và một số lời giải thích nếu có thể (tôi muốn hiểu những điều này hoạt động như thế nào). Cảm ơn trước sự giúp đỡ nào.

+0

Các lệnh này thậm chí không có vẻ hoạt động tốt với các thư mục rất lớn. Nó tiếp tục thêm tiền tố vào các tệp mà nó đã thêm tiền tố vào. – hnviet

Trả lời

24

Tôi không hiểu tại sao bạn không thể sử dụng tệp lô. Nhưng đây là một giải pháp mà nên làm việc với hầu hết các tên tập tin.

Critical - trước tiên bạn phải chắc chắn rằng bạn có một tên biến không xác định, tôi sẽ sử dụng fname

set "fname=" 

Tiếp theo là lệnh để thực sự làm việc đổi tên. Nó sẽ không hoạt động đúng nếu fname đã được xác định.

for %a in (prefix*.txt) do @(set "fname=%a" & call ren "%fname%" "%fname:*prefix=%") 

Biến fname được định nghĩa cho mỗi lần lặp và sau đó là cú pháp %fname:*prefix=% thay thế sự xuất hiện đầu tiên của "tiền tố" không có gì. Điều khó khăn là Windows lần đầu tiên cố gắng mở rộng% fname% khi lệnh được phân tích cú pháp đầu tiên. Tất nhiên điều đó sẽ không hiệu quả vì nó chưa được xác định. Trên dòng lệnh, phần trăm được giữ nguyên nếu biến không được tìm thấy. CALL gây ra một giai đoạn mở rộng thêm xảy ra sau khi biến đã được đặt, do đó việc mở rộng hoạt động.

Nếu fname được xác định trước khi chạy lệnh, nó sẽ chỉ đơn giản cố gắng đổi tên cùng một tệp cho mỗi lần lặp thay vì giá trị đang được gán trong vòng lặp.

Nếu bạn muốn chạy lại lệnh bằng một tiền tố khác, trước tiên bạn sẽ phải xóa định nghĩa.

EDIT - Đây là một tập tin thực thi có tên là "RemovePrefix.bat" mà không được công việc

::RemovePrefix.bat prefix fileMask 
@echo off 
setlocal 
for %%A in ("%~1%~2") do (
    set "fname=%%~A" 
    call ren "%%fname%%" "%%fname:*%~1=%%" 
) 

Giả sử bạn đã tập tin có tên như "prefixName.txt", sau đó bạn sẽ sử dụng kịch bản bằng cách thực hiện

RemovePrefix "prefix" "*.txt" 

Tệp lô sẽ đổi tên tệp trong thư mục hiện tại của bạn. Tệp batch cũng sẽ phải nằm trong thư mục hiện tại của bạn trừ khi tệp batch tồn tại trong một thư mục có trong biến PATH của bạn. Hoặc bạn có thể chỉ định đường dẫn đầy đủ đến tệp lô khi bạn gọi nó.

Quy tắc mở rộng khác nhau trong tệp lô.FOR biến phải được tham chiếu dưới dạng %% A thay vì% A và %% fname %% không được mở rộng ban đầu, thay vào đó tỷ lệ phần trăm đôi được chuyển đổi thành một phần trăm và sau đó% fname% được mở rộng sau CALL. Nó không quan trọng nếu fname đã được xác định với các tập tin thực thi. SETLOCAL làm cho định nghĩa của fname tạm thời (cục bộ) thành tập tin thực thi.

+0

Hoàn hảo, cảm ơn bạn rất nhiều vì lời giải thích bổ sung! Chỉnh sửa: Chỉ như một yêu cầu bổ sung, bạn có thể đăng một ví dụ nếu nó có thể được thực hiện trong một tập tin thực thi không? – Shadow

+0

Tôi không biết làm thế nào nó đã được hoàn hảo - có một lỗi khó chịu, nơi% f đã nhận được nhầm lẫn với% f trong% fname%. Mọi sửa đổi bây giờ :) – dbenham

+0

Sửa đổi gì tôi phải thực hiện trong tập lệnh này sao cho nó tìm kiếm '" .txt "' trong mỗi thư mục con của thư mục hiện tại và loại bỏ 'tiền tố' đã cho? – Kushal

23

Một giải pháp đơn giản hơn nhiều được cung cấp trong
https://superuser.com/a/871799/497147

tôi sao chép nó vào đây để truy cập dễ dàng hơn.

Hãy quên đi các tập lệnh phức tạp cho việc này.

rename là lệnh rất cũ và không bao giờ hoàn thành đúng cách. Nếu bạn không sử dụng nó đúng cách, kết quả có thể làm bạn ngạc nhiên.

Ví dụ để loại bỏ một tiền tố abcd từ abcd1.txt, abcd2.txt, abcd3.txt vv trong trật tự để có được 1.txt, 2.txt, 3.txt chỉ cần sử dụng

rename "abcd*.txt" "////*.txt" 

Bạn cần cùng một số / như số lượng nhân vật ban đầu bạn muốn xóa.

Đặt dấu nháy kép cho cả hai đối số.

+0

Vị cứu tinh trong ngày. –

+0

Kỹ thuật rất tuyệt và kỳ quái. Tôi đã cập nhật [Lệnh Windows RENAME của tôi giải thích các ký tự đại diện như thế nào?] (Https://superuser.com/q/475874/109090) Hỏi & Đáp với những thông tin này, mặc dù về mặt kỹ thuật, '/' không hoạt động như một Thẻ. – dbenham

+0

Vô cùng đơn giản và hoạt động hoàn hảo. Lưu ý rằng số "/" không liên quan đến số lượng ký tự được chỉ định trong biểu thức khớp. Một ví dụ khác: 'rename 'IM *. *" "////*.*" 'khớp với tiền tố 2-char và xóa 4 ký tự – PaoloC

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