2012-02-21 69 views
13

Làm cách nào để viết một tập tin batch hoặc cmd sẽ đổi tên tất cả các tệp trong một thư mục? Tôi đang sử dụng Windows.Đổi tên tất cả các tệp trong thư mục bằng tập lệnh batch của Windows

Thay đổi này:

750_MOT_Forgiving_120x90.jpg 
751_MOT_Persecution_1_120x90.jpg 
752_MOT_Persecution_2_120x90.jpg 
753_MOT_Hatred_120x90.jpg 
754_MOT_Suffering_120x90.jpg 
755_MOT_Freedom_of_Religion_120x90.jpg 
756_MOT_Layla_Testimony_1_120x90.jpg 
757_MOT_Layla_Testimony_2_120x90.jpg 

Để này:

750_MOT_Forgiving_67x100.jpg 
751_MOT_Persecution_1_67x100.jpg 
752_MOT_Persecution_2_67x100.jpg 
753_MOT_Hatred_67x100.jpg 
754_MOT_Suffering_67x100.jpg 
755_MOT_Freedom_of_Religion_67x100.jpg 
756_MOT_Layla_Testimony_1_67x100.jpg 
757_MOT_Layla_Testimony_2_67x100.jpg 
+1

cửa sổ và bất cứ điều gì chạy trong một .bat hoặc .cmd tập tin? – Blainer

+0

Dude, nếu bạn muốn được giúp đỡ, bạn không thể mong đợi mọi người trở nên tâm linh. –

Trả lời

22

câu lệnh for để lặp qua các tên (loại FOR /? để được giúp đỡ), và tìm kiếm chuỗi và thay thế (loại SET /? để được giúp đỡ) .

@echo off 
setlocal enableDelayedExpansion 
for %%F in (*120x90.jpg) do (
    set "name=%%F" 
    ren "!name!" "!name:120x90=67x100!" 
) 


CẬP NHẬT - 2012-11-07

Tôi đã điều tra như thế nào RENAME giao dịch lệnh với các kí hiệu: How does the Windows RENAME command interpret wildcards?

Nó chỉ ra rằng vấn đề cụ thể này có thể được giải quyết rất dễ dàng bằng cách sử dụng lệnh RENAME mà không cần bất kỳ tập lệnh batch nào.

ren *_120x90.jpg *_67x100.* 

Số ký tự sau _ không quan trọng. Đổi tên sẽ vẫn hoạt động bình thường nếu 120x90 trở thành x hoặc xxxxxxxxxx. Khía cạnh quan trọng của vấn đề này là toàn bộ văn bản giữa _. được thay thế.

+2

Tôi không chắc đây có phải là ví dụ hoàn chỉnh hay không. Nhưng [Điều này] (http://stackoverflow.com/a/3811991) làm việc cho tôi như một nét duyên dáng :) –

+2

@ Anand - Tôi đã thêm một giải pháp đơn giản hơn nhiều chỉ bằng cách sử dụng lệnh REN. Liên kết trong nhận xét của bạn về cơ bản giống với câu trả lời ban đầu của tôi. – dbenham

+0

Bạn có thể tách ra hai câu trả lời của mình không? Tôi sẽ để lại một lớp lót 'ren' trong cái này; đó là tốt nhất! –

8

Kể từ Windows 7, bạn có thể thực hiện việc này trong một dòng PowerShell.

powershell -C "gci | % {rni $_.Name ($_.Name -replace '120x90', '67x100')}" 

Giải thích

powershell -C "..." ra mắt một phiên PowerShell để chạy các lệnh trích dẫn. Nó trở về vỏ bên ngoài khi lệnh hoàn thành. -C là viết tắt của -Command.

gci trả về tất cả các tệp trong thư mục hiện tại. Đó là bí danh cho Get-ChildItem.

| % {...} tạo đường dẫn xử lý từng tệp. % là bí danh cho Foreach-Object.

$_.Name là tên của tệp hiện tại trong đường ống.

($_.Name -replace '120x90', '67x100') sử dụng toán tử -replace để tạo tên tệp mới. Mỗi lần xuất hiện của chuỗi con đầu tiên được thay thế bằng chuỗi con thứ hai.

rni thay đổi tên của từng tệp. Tham số đầu tiên (được gọi là -Path) xác định tệp. Tham số thứ hai (được gọi là -NewName) chỉ định tên mới. rni là bí danh cho Rename-Item.

Ví dụ

$ dir 
Volume in drive C has no label. 
Volume Serial Number is A817-E7CA 

Directory of C:\fakedir\test 

11/09/2013 16:57 <DIR>   . 
11/09/2013 16:57 <DIR>   .. 
11/09/2013 16:56     0 750_MOT_Forgiving_120x90.jpg 
11/09/2013 16:57     0 751_MOT_Persecution_1_120x90.jpg 
11/09/2013 16:57     0 752_MOT_Persecution_2_120x90.jpg 
       3 File(s)    0 bytes 
       2 Dir(s) 243,816,271,872 bytes free 

$ powershell -C "gci | % {rni $_.Name ($_.Name -replace '120x90', '67x100')}" 

$ dir 
Volume in drive C has no label. 
Volume Serial Number is A817-E7CA 

Directory of C:\fakedir\test 

11/09/2013 16:57 <DIR>   . 
11/09/2013 16:57 <DIR>   .. 
11/09/2013 16:56     0 750_MOT_Forgiving_67x100.jpg 
11/09/2013 16:57     0 751_MOT_Persecution_1_67x100.jpg 
11/09/2013 16:57     0 752_MOT_Persecution_2_67x100.jpg 
       3 File(s)    0 bytes 
       2 Dir(s) 243,816,271,872 bytes free 
+0

@MethodMan giá trị nào nên dấu thời gian có? –

+0

Tôi đã tìm ra bằng cách lộn xộn xung quanh với kịch bản RobbCopy và tạo một hàm goto bên trong tệp bat .. nhờ tôi không quen với powerhell nhiều nhưng nếu tôi phải có giá trị dấu thời gian, nó sẽ là 'yyyymmddss' với mặt nạ sẽ có '_1 _2 _3 etc ...' tùy thuộc vào số lượng tệp .. Tôi đã có thể thực hiện việc này trong một tệp hàng loạt bằng cách sử dụng robocopy .. – MethodMan

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