2014-05-13 65 views
0

我沒有問題,將序列前綴添加到文件名。以下對於有問題的頂級目錄非常有用。Powershell錯誤嘗試重複使用順序前綴*遞歸*

$path="E:\path\newtest1" 
$count=4000 
Get-ChildItem $path -recurse | Where-Object {!$_.PSIsContainer -and $_.Name -NotMatch '^\d{4}\s+'} | ForEach -Process {Rename-Item $_ -NewName ("$count " + $_.name -f $count++) -whatif} 

但是,如果在頂層目錄內的子文件夾中有文件,這些都完全錯過了。 Whatif報告說,對於任何更深層次的文件,它「不存在」。

我已經嘗試了以下,基於查看其他遞歸問題的一些頁面,但正如你可能猜測我不知道它在做什麼。 Whatif表明它至少可以拾取和重命名所有文件。但下列情況太多,使每個數字各文件的多個副本:

$path="E:\path\newtest1" 
$count=4000 
Get-ChildItem -recurse | ForEach-Object { Get-ChildItem $path | Rename-item -NewName ("$count " + $_.Basename -f $count++) -whatif} 

真的渴望得到有關如何獲得第一這兩個片段的一些指導工作,找到所有子目錄中的所有文件並用前面的順序號重命名它們。

回答

2

嘗試它像這樣:

Get-ChildItem $path -recurse -file | Where Name -NotMatch '^\d{4}\s+' | 
    Rename-Item -NewName {"{0} $($_.name)" -f $count++} -whatif 

當您提供$_作爲參數(不通過管道對象),也被分配到Path參數是字符串類型。 PowerShell嘗試將該FileInfo對象轉換爲字符串,但不幸的是,嵌套文件夾中文件的「ToString()」表示只是文件名而不是完整路徑。可以通過執行看到:

Get-ChildItem $path -recurse -file | Where Name -NotMatch '^\d{4}\s+' | ForEach {"$_"} 

的解決方法是,A)管的對象到重命名 - 項目或B)例如使用FullName屬性Rename-Item -LiteralPath $_.FullName ...

+0

或者C)將對象傳遞給ForEach並使用$ _。MoveTo() – TheMadTechnician

+0

非常感謝Keith,我成功改爲{「{0} $($ _。name)」。我不能工作的部分是語法A)將對象管道化爲Rename-item。如果我使用'ForEach-object -Process {Rename-Item {「{0} $($ _。FullName)」-f $ count ++} -whatif}'-whatif reports「由於指定了參數,無法計算參數'Path'作爲腳本塊「。添加-LiteralPath會產生「NamedParameterNotFound」。任何建議非常感謝。 – user3632867

+0

在場景A中,由於您接受管道輸入,因此不要使用「Foreach」直接管入Rename-Item命令。訣竅是你需要訪問NewName參數參數中的管道對象。這就是你使用一個腳本塊來完成這項工作。看到我上面的第一個例子。這適用於PowerShell V3及更高版本。 –