заменить имена всех директорий и файлов в PS - PullRequest
5 голосов
/ 15 декабря 2011

Я хочу заменить все пробелы на "_" в именах всех подпапок и файлов. К сожалению, когда я печатаю:

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

Сообщение об ошибке:

Rename-Item: исходный и целевой путь должны отличаться. В строке: 1 символ: 60 + Get-ChildItem -recurse -name | ForEach-Object {Rename-Item <<<< $ _ $ <em>.replace ("", "")} + CategoryInfo: WriteError: (PATH_HERE) [Rename-Item], IOException + FullyQualifiedErrorId: RenameItemIOError, Microsoft.PowerShell.Commands.RenameItemCommand

Как мне улучшить этот короткий код?

Ответы [ 2 ]

8 голосов
/ 15 декабря 2011

Не используйте переключатель Name, он выводит только имена объектов, а не их полный путь. Попробуйте это:

Get-ChildItem -Recurse | `
   Where-Object {$_.Name -match ' '} | `
     Rename-Item -NewName { $_.Name -replace ' ','_' }
5 голосов
/ 15 декабря 2011

Проблема здесь в том, что если в имени файла нет пробела, имя не изменится.Это не поддерживается Rename-Item.Вместо этого вы должны использовать Move-Item:

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

Кроме того, в своем ответе вы пропустили подчеркивание в $_.replace(...) и добавили пробелы вместо пустой строки.Включил это в мой ответ.

...