При использовании Rename-item $_
ваша настройка отправки 1-го позиционного параметра, -Path
, равная $_
, отлитая в виде строки (которая будет именем файла). Проблема с -Path
заключается в том, что она не поддерживает специальные символы очень vell, которые, как я предполагаю, у вас есть в вашем имени файла.
Если вы использовали $_ | Rename-Item
, то командлет связал бы свойство FullName
с параметром -LiteralPath
в командлете. -LiteralPath
является альтернативой -Path
, который работает лучше со специальными символами, и из-за этого он используется по умолчанию для привязки параметров в конвейерах.
Используя приведенный ниже подход, мы скажем, что ваш скрипт использует -LiteralPath
и связывает его с полным путем файла FullName
, который должен решить ваши проблемы. Это рекомендуемый способ использования командлета, если вы используете foreach-loop вместо Get-ChildItem | Rename-Item
.
Кроме того, если вы хотите, чтобы все файлы в папке, вам не нужно использовать фильтр. Попробуйте образец ниже.
$i = 1
cd "C:\Users\myname\Desktop\test"
get-childitem | %{ Rename-Item -LiteralPath $_.FullName -NewName ("filename_s01e{0:D3}.lnk" -f $i++) }
Вы также мог бы включать путь_к_папку в Get-ChildItem
командлете и создать переменный в Еогеаспе петле, как:
Get-ChildItem -Path "C:\Users\myname\Desktop\test" |
% -Begin { $i = 1 } -Process {
Rename-Item -LiteralPath $_.FullName -NewName ("filename_s01e{0:D3}.lnk" -f $i++)
}
Я думаю, что проблема в том, как вы используете .lnk файлы. Почему бы просто не использовать переключатель -WhatIf? – mjolinor
Это, по сути, то, что вы пытаетесь сделать? http://stackoverflow.com/questions/1523043/how-to-loop-through-files-and-rename-using-powershell – beavel
, если я использую переключатель whatif с исходными файлами, я получаю ту же ошибку. Я использовал ответ из этого вопроса в качестве шаблона: http://stackoverflow.com/questions/18304025/bulk-renaming-of-files-in-powershell-with-sequential-numeric-suffixes – user3132608