2011-12-15 88 views
5

我想在所有子文件夾和文件的名稱中將所有空格字符替換爲「_」。 不幸的是,當我鍵入:在PS中替換所有目錄和文件的名稱

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

錯誤消息:

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

我應該如何改善這個短碼?

回答

5

這裏的問題是,如果文件名中沒有空格,名稱不會更改。 Rename-Item不支持此功能。您應該使用Move-Item代替:

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

此外,在你的答案你錯過了下劃線在$_.replace(...)再加上你那裏有一個空字符串代替空格。包括在我的答案。

+1

Move-Item:進程無法訪問文件,因爲它正在被另一個進程使用。 在線:1 char:58 + Get-ChildItem -recurse -name | ForEach-Object {Move-Item <<<< $ _ $ _。replace(「」,「_」)} + CategoryInfo:WriteError: – matandked

5

不要使用Name開關,它只輸出對象的名稱,而不是它們的完整路徑。試試這個:

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

不錯。可能希望包含Where-Object {$ _。Attributes -notmatch'Directory'}作爲附加過濾器。迭代時,您不能重命名目錄。 –

+1

@MichaelBlackburn另一個訣竅是按降序對FullName進行排序。這會強制腳本在修改目錄本身之前處理目錄中的所有子項。 –

相關問題