2011-12-15 31 views
5

Tôi muốn thay thế tất cả các ký tự khoảng trắng thành "_" trong tên của tất cả các thư mục con và tệp. Thật không may khi tôi gõ: Thông điệpthay thế tên của tất cả các directiories và các tập tin trong PS

Get-ChildItem -recurse -name | ForEach-Object { Rename-Item $_ $_.replace(" ","_") } 

Lỗi:

Rename-Item : Source and destination path must be different. At line:1 char:60 + Get-ChildItem -recurse -name | ForEach-Object { Rename-Item <<<< $_ $.replace(" ","") } + CategoryInfo : WriteError: (PATH_HERE) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

Làm thế nào tôi sẽ được cải thiện mã ngắn này?

Trả lời

5

Vấn đề ở đây là nếu không có không gian trong tên tệp, tên không thay đổi. Điều này không được hỗ trợ bởi Rename-Item. Bạn nên sử dụng Move-Item thay vì:

Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(" ", "_") } 

Thêm vào đó, trong câu trả lời của bạn, bạn bỏ lỡ gạch trong $_.replace(...) cộng với bạn nơi thay thế không gian với một chuỗi rỗng. Bao gồm điều này trong câu trả lời của tôi.

+1

Di chuyển-Mục: Quy trình không thể truy cập tệp vì nó đang được sử dụng bởi một quy trình khác. Tại dòng: 1 char: 58 + Get-ChildItem -recurse -name | ForEach-Object {Move-Item <<<< $ _ $ _. Thay thế ("", "_")} + CategoryInfo: WriteError: – matandked

5

Không sử dụng nút Chuyển tên, nó chỉ xuất ra tên của đối tượng chứ không phải đường dẫn đầy đủ của chúng. Hãy thử cách này:

Get-ChildItem -Recurse | ` 
    Where-Object {$_.Name -match ' '} | ` 
    Rename-Item -NewName { $_.Name -replace ' ','_' } 
+0

Rất tốt. Có thể muốn bao gồm đối tượng {$ _. Thuộc tính -notmatch 'Directory'} làm bộ lọc bổ sung. Bạn không thể đổi tên một thư mục trong khi bạn đang lặp qua nó. –

+1

@MichaelBlackburn mẹo khác là sắp xếp bộ sưu tập theo FullName theo thứ tự giảm dần. Điều này buộc kịch bản xử lý tất cả các mục con trong một thư mục trước khi sửa đổi thư mục. –

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