6

我想在所有子文件夹和文件的名称中将所有空格字符替换为“_”。不幸的是,当我输入:

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

错误信息:

Rename-Item :源路径和目标路径必须不同。在 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。重命名项目命令

我应该如何改进这个短代码?

4

3 回答 3

15

不要使用名称开关,它只输出对象的名称,而不是它们的完整路径。试试这个:

Get-ChildItem -Recurse | `
   Where-Object {$_.Name -match ' '} | `
     Rename-Item -NewName { $_.Name -replace ' ','_' }
于 2011-12-15T12:32:05.513 回答
6

这里的问题是,如果文件名中没有空格,则名称不会改变。这不受Rename-Item. 您应该Move-Item改用:

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

$_.replace(...)此外,在您的回答中,您错过了用空字符串替换空格的下划线。在我的回答中包含了这个。

于 2011-12-15T10:42:31.830 回答
1

添加过滤器对我有用:

Get-ChildItem C:\path-to-directory -Recurse -Filter *foo* | Rename-Item -NewName { $_.name -replace 'foo', 'bar'} -verbose
于 2020-06-03T02:29:26.607 回答