替换PS中所有directiories和文件的名称

mat*_*ked 5 powershell renaming

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

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

错误信息:

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

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

Sha*_*evy 12

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

Get-ChildItem -Recurse | `
   Where-Object {$_.Name -match ' '} | `
     Rename-Item -NewName { $_.Name -replace ' ','_' }
Run Code Online (Sandbox Code Playgroud)


Ste*_*fan 5

这里的问题是,如果文件名中没有空格,则名称不会更改。不支持此功能Rename-Item。您应该Move-Item改用:

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

此外,在您的答案中,您错过了下划线,$_.replace(...)以及用空字符串替换空格的地方。包括在我的答案中。

  • Move-Item:该进程无法访问文件,因为该文件正在被另一个进程使用。在第1行:char:58 + Get-ChildItem -recurse -name | ForEach-Object {Move-Item &lt;&lt;&lt;&lt; $ _ $ _。replace(“”,“ _”)} + CategoryInfo:WriteError: (5认同)