2014-08-30 16 views
7

Tôi có khoảng 1000 hình ảnh và chúng có tên như "IMG-12223". Tôi muốn đổi tên chúng thành 1 2 3 4 ... 1000. Làm thế nào tôi có thể làm điều đó. Tôi đã viết một tập lệnh batch liệt kê các tệp nhưng tôi không biết cách đổi tên từng tệp. ví dụ. đổi tên hình ảnh đầu tiên có tên "IMG-12223" thành 1, hình ảnh thứ hai có tên "IMG-23441" thành 2 và cứ thế ...Đổi tên nhiều tệp trong một thư mục bằng tập lệnh batch

for /r %%i in (*) do (
    echo %c% 
) 
+0

Chỉ cần gợi ý: Trình xem đa phương tiện miễn phí [IrfanView] (http://www.irfanview.com/) đã tích hợp [đổi tên hàng loạt] (http://graphicssoft.about.com/cs/renamers/ht /irfanviewrename.htm) tính năng đổi tên hình ảnh bằng bộ đếm. Trình quản lý tệp shareware [Total Commander] (http://www.ghisler.com/) có tính năng [multi-rename] (http://www.ghisler.com/advanced.htm#tutorial_rename) với nhiều tùy chọn hơn và rất dễ sử dụng. Nó không có ý nghĩa trong quan điểm của tôi bằng cách sử dụng một tập tin batch cho một nhiệm vụ đổi tên tập tin không được thực hiện tự động như nhiệm vụ theo lịch trình. – Mofi

Trả lời

12

Đây là tập lệnh. Chỉ cần đặt kịch bản trong thư mục của bạn và chạy nó.

@echo off & setlocal EnableDelayedExpansion 

set a=1 
for /f "delims=" %%i in ('dir /b *') do (
    if not "%%~nxi"=="%~nx0" (
    ren "%%i" "!a!" 
    set /a a+=1 
) 
) 

Nếu bạn muốn giữ lại các phần mở rộng, tức là đổi tên "IMG-12223.jpg", "IMG-12224.jpg", vv để "1.jpg", "2.jpg", vv, bạn có thể sử dụng tập lệnh sau.

@echo off & setlocal EnableDelayedExpansion 

set a=1 
for /f "delims=" %%i in ('dir /b *.jpg') do (
    ren "%%i" "!a!.jpg" 
    set /a a+=1 
) 

[Cập nhật] Here're giải thích cho các dòng nêu trong bình luận của Jack.

  • setlocal EnableDelayedExpansion

Nói chung, chúng tôi muốn biến a bị trì hoãn mở rộng khi nó được thực hiện nhưng không phải là dòng được đọc. Nếu không có nó, biến số a không thể nhận được giá trị gia tăng nhưng luôn luôn 1.

Để biết chi tiết về EnableDelayedExpansion, vui lòng tham khảo câu trả lời https://stackoverflow.com/a/18464353/2749114.

  • for /f "delims=" %%i in ('dir /b *.jpg')

Đây dir với /b tùy chọn, liệt kê chỉ nộp tên của tất cả các file jpg.

Vòng lặp for truyền tải và đổi tên tất cả các tệp jpg.

Đối với tùy chọn delims, vì ký tự dấu phân cách mặc định là khoảng trắng, không có tùy chọn delims=, nó không thành công với tệp hình ảnh có dấu cách trong tên tệp. I E. đối với tệp hình ảnh có tên "img with spaces.jpg", không có tùy chọn, giá trị của %%i là "img" nhưng không phải là toàn bộ tên "img with spaces.jpg", không chính xác.

Đối với for vòng lặp, vui lòng tham khảo trang http://ss64.com/nt/for_f.html.

  • if not "%%~ni"=="%~n0"

tôi có thay đổi nó để if not "%%~nxi"=="%~nx0" được chính xác hơn. Và các mã được đính kèm đã được cập nhật.

Thực tế được sử dụng để tránh đổi tên chính tệp bat. Nếu chúng ta giới hạn việc đổi tên chỉ khi các tập tin "jpg", thì dòng đó là không cần thiết.

%%~nxi là tên tệp có phần mở rộng cho mỗi tệp được duyệt qua. Và %~nx0 là tệp dơi đang chạy với phần mở rộng. Để biết chi tiết, vui lòng tham khảo trang DOS BAT file equivalent to Unix basename command?.

+0

Cảm ơn bạn đã trả lời, bạn có thể giải thích các dòng sau "setlocal EnableDelayedExpansion", "for/f" delims = "%% i in ('dir/b * .jpg')", nếu không "%% ~ ni" == "% ~ n0" –

+0

Chắc chắn, tôi vừa cải thiện kịch bản, và cũng thêm giải thích cho các dòng bạn đã đề cập. Trên thực tế, bạn cũng có thể thay đổi tập lệnh một chút để lấy thư mục hình ảnh của bạn làm tham số. – Landys

0

Hãy thử điều này, bạn có cặp giá trị tên trong một tệp văn bản rồi giá trị vòng lặp và thực hiện phép thuật. Các thời gian được phân cách bằng khoảng trống. Điều này cho phép bạn ánh xạ cũ-> tên tệp mới cho phù hợp. Hoặc bạn giữ idx + 1 truy cập và sử dụng nó cho tên tập tin mới.

keyvalue.bat

@echo off 
set idx=0 
for /F "tokens=1,2" %%A in (keyvalue.txt) do call :PROCESS "%%A" "%%B" 
GOTO :END 

:PROCESS 
set var1=%~1 
set var2=%~2 
set /A idx=%idx%+1 
echo %var1% goes to %var2% (%idx%) 
GOTO :EOF 

:END 
pause 

keyvalue.txt

file888.dat newfile1.dat 
file333.dat newfile2.dat 
file9.dat newfile3.dat 
file01.dat newfile4.dat 
7

Không cần cho một kịch bản hàng loạt. Một lớp lót đơn giản từ dòng lệnh có thể thực hiện công việc :-)

Tôi sử dụng DIR/B để tạo danh sách tệp, được gửi tới FINDSTR để đánh số tệp, tất cả kèm theo FOR/F để phân tích kết quả và thực hiện việc đổi tên.

for /f "delims=: tokens=1*" %A in ('dir /b *.jpg^|findstr /n "^"') do @ren "%B" "%A%~xB" 

Tăng gấp đôi phần trăm nếu bạn muốn đặt lệnh trong tập lệnh theo lô.

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