2013-12-24 3 views
-1

Я хочу переименовать все файлы в папке. я сделал тестовую папку с файлами ссылок в исходные файлы для случая, если что-то не так. Я искал часы в Google и сделал скрипт с несколькими snipplets кода.переименовать все файлы в папке с увеличивающимися номерами

это мой сценарий:

$i = 1 
cd "C:\Users\myname\Desktop\test" 
get-childitem -filter "*" | %{rename-item $_ -newname ('filename_s01e{0:D3}.lnk' -f $i++)} 

, когда я запустить скрипт я получаю сообщение об ошибке, что переименование не представляется возможным, потому что элемент не существует в originalfilename .lnk

я попытался изменить фильтры и имя файла, но я не знаю, почему он не хватает элементов.

thx за помощью!

+0

Я думаю, что проблема в том, как вы используете .lnk файлы. Почему бы просто не использовать переключатель -WhatIf? – mjolinor

+0

Это, по сути, то, что вы пытаетесь сделать? http://stackoverflow.com/questions/1523043/how-to-loop-through-files-and-rename-using-powershell – beavel

+0

, если я использую переключатель whatif с исходными файлами, я получаю ту же ошибку. Я использовал ответ из этого вопроса в качестве шаблона: http://stackoverflow.com/questions/18304025/bulk-renaming-of-files-in-powershell-with-sequential-numeric-suffixes – user3132608

ответ

2

При использовании 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++) 
    } 
+0

thx вы мне очень помогли. Мне пришлось обновить до версии powershell v3, но теперь я отлично справился с этой строкой: get-childitem | имя сортируемого объекта | % {Rename-Item -LiteralPath $ _. FullName -NewName ("filename_s01e {0: D3} .lnk" -f $ i ++)} – user3132608

Смежные вопросы