2011-12-15 49 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进行排序。这会强制脚本在修改目录本身之前处理目录中的所有子项。 –

相关问题