Добавить ".backup" ко всем файлам, папкам и подпапкам в Powershell 2.0

Я хочу добавить ".backup" ко всем именам файлов и папок (включая подпапки и файлы в подпапках), используя Powershell v2.0.

Я придумал этот сценарий:

$origin = get-childItem -recurse | ?{ !( $_.name -like "*.backup" ) } 
$folders = $origin | ?{ $_.PSIsContainer }
$files =  $origin | ?{ ! $_.PSIsContainer }
$files | rename-item -force -newname { $_.name + '.backup' }
$folders | rename-item -force -newname { $_.name + '.backup' }

Но я получаю эту ошибку для многих элементов, заявляя, что путь неверен:

Rename-Item : Cannot rename because item at 'Microsoft.PowerShell.Core\FileSystem::E:\backup\test.backup\subfolder.backup\proc 1\backup\example.docx' does not exist.
At line:1 char:21
+ $files | rename-item <<<<  -force -newname { $_.name + '.backup' }
+ CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand

Но, тем не менее, такой файл (example.docx) существует по этому пути.

Почему выдается эта ошибка? И какой правильный код для добавления '.backup' к файлам и папкам в PS 2.0? Спасибо за любые идеи!

РЕДАКТИРОВАТЬ: я не думаю, что мой вопрос является дубликатом При переименовании файла в PowerShell, как мне обрабатывать имена файлов с помощью "["? по 2 причинам: 1- цели разные (достаточно взглянуть на названия); 2- этот поток не предоставляет мне код, чтобы делать то, что я хочу, даже если это хорошая отправная точка (вот почему я привел ссылку на него в своем ответе). Мой вопрос может быть неуместным, но мне потребовалось несколько часов, чтобы понять, так что, возможно, я смогу сэкономить кому-то несколько часов разочарования. Но мой вопрос плохо сформулирован, сейчас переделаю.

1 ответ

Решение

Я обнаружил, что это ошибка в Powershell до версии 3.0 в командлете Rename-Item (см.: При переименовании файла в PowerShell, как мне обрабатывать имена файлов с помощью "["?). Единственное, что я нашел, - это вместо этого использовать Move-Item.

Вот полный сценарий, который я придумал:

$path = 'E:\backup'
$origin = get-childItem -path $path -recurse -exclude *.backup
$folders = $origin | ?{ $_.PSIsContainer }
$files =  $origin | ?{ ! $_.PSIsContainer }
$files | %{ move-item -force -literalpath $_.fullname -destination ($_.fullname + '.backup') }
$folders | sort-object -descending -property fullname | %{ move-item -force -literalpath $_.fullname -destination ($_.fullname + '.backup') }

У кого-нибудь есть лучший код? В противном случае я отмечу это как "решено".

Другие вопросы по тегам