2011-08-24 93 views
7

調用此PowerShell命令並出現錯誤。使我抓狂。在PowerShell中遞歸重命名文件

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

這裏是迴應:

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 

如果我刪除的最後一部分,我得到的文件列表。任何線索?顯然,我還沒有搞懂PowerShell。

注:我試圖發佈這個超級用戶,但該網站現在一直失敗 - 不會讓我添加這個確切的問題。

這裏大大簡化了。我甚至無法得到這個經典例子的工作。

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

謝謝@JNK,%做到了。我需要的解決方案是這樣的,如果你有興趣:

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

看到http://stackoverflow.com/a/21614001/8479 – Rory

回答

7

我認爲你需要的foreach對象:

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

的管道陣列不能被重新命名爲一組。

+0

沒了相同錯誤。我在上面添加了一個簡化版本。 –

+0

@丹尼爾 - 嘗試新的答案 – JNK

+0

是的!就是這樣 - 謝謝。我需要更好地理解集合與項目。但這太棒了! –

5

下面是一個簡化版本,重命名文件只

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

編輯:增加了清晰度換行符)

+1

這裏真正的區別是在'rename-item'參數中使用代碼塊'{...}'來引用'$ _'(這就是爲什麼'foreach-object'也提供了一個解決方案。 – Richard

+0

True,foreach-對象完成這項工作,但它增加了開銷(並且速度較慢)。 –

+0

有趣的是,這讓重命名項目把它的參數作爲一個集合處理,而不是在foreach的一組操作中調用重命名項目。 –