2011-08-24 35 views
7

Gọi lệnh này có quyền hạn và gặp lỗi. Lái xe cho tôi.Đệ quy đổi tên tệp trong Powershell

Prompt> get-childitem -recurse ./ *NYCSCA* | where-object { $_.Name -like 
"*NYCSCA*" } | rename-item $_ -newname $_.Name.Replace(" ","_") -whatif 

Dưới đây là câu trả lời:

You cannot call a method on a null-valued expression. 
At line:1 char:140 
+ get-childitem -recurse ./ *NYCSCA* | where-object { $_.Name -like "*NYCSCA*" } | select FullName | rename-item $_ -n 
ewname $_.Name.Replace <<<< (" ","_") -whatif 
    + CategoryInfo   : InvalidOperation: (Replace:String) [], RuntimeException 
    + FullyQualifiedErrorId : InvokeMethodOnNull 

Nếu tôi loại bỏ phần cuối cùng, tôi nhận được một danh sách các tập tin. Bất kì manh mối nào? Tôi đã không grocked powershell được nêu ra, rõ ràng.

Lưu ý: Tôi đã cố đăng nội dung này lên superuser, nhưng trang web liên tục bị lỗi - sẽ không cho phép tôi thêm câu hỏi chính xác này.

Ở đây nó được đơn giản hóa rất nhiều. Tôi thậm chí không thể có được ví dụ cổ điển này để làm việc.

gci *NYCSCA* | ren $_ ($_.Name).Replace("foo","bar") 

Cảm ơn bạn @ JNK,% đã làm. Giải pháp tôi cần là thế này, trong trường hợp bạn đang quan tâm:

gci -recurse | where-object{ $_.Name -like "*NYCSCA*"} | %{rename-item $_.FullName $_.FullName.Replace("NYCSCA","SDUSD") } 
+0

thấy http://stackoverflow.com/a/21614001/8479 – Rory

Trả lời

7

tôi nghĩ rằng bạn cần foreach-đối tượng:

get-childitem -recurse ./ *NYCSCA* | where-object { $_.Name -like 
"*NYCSCA*" } | % {rename-item $_ -newname $_.Name.Replace(" ","_") -whatif} 

Mảng đường ống không thể đổi tên như là một tập.

+0

nope cùng lỗi. Tôi đã thêm một phiên bản đơn giản ở trên. –

+0

@Daniel - hãy thử câu trả lời mới – JNK

+0

Có! Đó là nó - cảm ơn bạn. Tôi cần phải hiểu bộ so với các mặt hàng tốt hơn. Nhưng điều này thật tuyệt! –

5

Dưới đây là một phiên bản đơn giản để đổi tên file chỉ

Get-ChildItem -Filter *NYCSCA* -Recurse | 
Where-Object {!$_.PSIsContainer} | 
Rename-Item -NewName { $_.Name.Replace(' ','_') } -WhatIf 

(Edit: ngắt dòng thêm cho rõ ràng)

+1

Sự khác biệt thực sự ở đây là sử dụng các khối mã '{...}' trong các đối số 'rename-item' để cho phép tham chiếu đến' $ _' (đó là lý do 'foreach-object' cũng cung cấp một giải pháp. – Richard

+0

True, foreach- –

+0

Thú vị, vì vậy điều này cho phép đổi tên mục xử lý các đối số của nó như là một tập hợp, thay vì phải đổi tên các mục được gọi trong một tập hợp các hoạt động của foreach. –

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