2009-10-06 31 views
19

Tôi muốn đổi tên tất cả các tệp jpg trong một thư mục thành quy ước thống nhất như Picture00000001.jpg trong đó 00000001 là bộ đếm.Làm thế nào để lặp qua các tập tin và đổi tên bằng PowerShell?

Nó sẽ là một bước đi trong công viên trong C# nhưng tôi nghĩ rằng đây là loại bánh mì và bơ thứ mà PowerShell được tạo ra.

Tôi đoán cái gì đó như

$files = ls *.jpg 
$i=0 
foreach($f in $files) { Rename-Item $f -NewName "Picture"+($i++)+".jpg" } 

Nhưng trước khi tôi nhấn ga về vấn đề này tôi muốn 1) định dạng quầy, và 2) có một số cảm giác rằng điều này là trong thực tế thậm chí là một ý tưởng tốt .

Nếu điều này nghe có vẻ giống OCD hơn là một ý tưởng hay, vui lòng lên tiếng.

Trả lời

23

Bạn có thể làm điều này khá đơn giản trong PowerShell:

ls *.jpg | Foreach -Begin {$i=1} ` 
    -Process {Rename-Item $_ -NewName ("Picture{0:00000000}.jpg" -f $i++) -whatif} 

Nếu bạn' đang tìm kiếm "tên cơ sở" nếu bạn đang sử dụng PowerShell 2.0, chỉ cần sử dụng thuộc tính Cơ sở mà PowerShell thêm vào mỗi đối tượng FileInfo:

ls *.jpg | Format-Table Basename 

Lưu ý rằng trên PowerShell 1.0, PowerShell Community Extensions thêm thuộc tính Cơ sở này.

Nếu mục đích là để nối thêm một chuỗi truy cập để basename của tập tin trong hoạt động đổi tên sau đó thử này:

ls *.jpg | Foreach {$i=1} ` 
    {Rename-Item $_ -NewName ("$($_.Basename){0:00000000#}.jpg" -f $i++) -whatif} 
+0

Xin lỗi vì sự ngắt kết nối giữa tiêu đề và câu hỏi - Tôi đã thay đổi tiêu đề. –

+0

Không sao, tôi đã cập nhật câu trả lời của mình cho phù hợp. –

+0

Whoa, bạn có thể đặt khối tập lệnh 'begin' và' process' riêng lẻ thành 'ForEach-Object'? Tôi phải xem xét lại một số vấn đề về chơi gôn. – Joey

2

Hãy thử điều này để có được những FilenameWithOutExtension

$ f.DirectoryName + "\" + $ f.BaseName

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