2014-01-14 5 views
0

У меня есть большое количество файлов в каталоге с этим типом соглашения об именах: «[Дата] [Фамилия] 345.pdf». Примечание: 345 является постоянным для всех из нихПакетное переименование файлов в каталоге путем изменения имен файлов

Я хотел бы переименовать все файлы, чтобы они читали «[Lastname] [Date] 345.pdf».

Edit: я имел опечатка в там первоначально

Я имел некоторый успех:

gci -Filter *.pdf| %{Rename-Item $_.fullname $_.Name.Split(" ")[1]} 

Но это дает мне только "[Date] .pdf". В принципе, я не могу понять, как использовать приведенную выше команду, чтобы объединить две разные части раскола. Я в основном хочу «[1] [0] [2] .pdf», если это имеет смысл.

Спасибо.

ответ

1

Другой подход, используя регулярные выражения:

Get-ChildItem *.pdf | % { 
    $newName = $_.Name -replace '^(.*) (\S+) (\S+\.pdf)$', '$2 $1 $3' 
    Rename-Item $_ $newName 
} 

Регулярное Разбивка выражение:

  • ^(.*) совпадает с любым количеством символов в начале строки и фиксирует их в группе. [Date] в вашем примере имя файла [Date] [Lastname] 345.pdf.
  • (\S+) соответствует одному или нескольким последовательным символам без пробелов и фиксирует их во второй группе. [Lastname] в вашем примере filename [Date] [Lastname] 345.pdf.
  • (\S+\.pdf)$ соответствует одному или нескольким последовательным символам без пробелов, за которыми следует строка .pdf в конце строки и фиксирует это в третьей группе. 345.pdf в вашем примере filename [Date] [Lastname] 345.pdf.

Группы называются по $1, $2 и $3, поэтому строка замены '$2 $1 $3' переупорядочиваем группы так, как вы хотите.

+0

Это сработало! Благодарю. Можете ли вы точно объяснить, что здесь происходит? Все еще пытаюсь учиться. – user3194848

+0

@ user3194848 См. Обновленный ответ. –

+1

@ user3194848 Кстати, вопрос неоднозначен ... пример в начале означает, что вы хотите заменить ** 345 ** на ** 302 **, но то, что вы говорите в конце, означает, что вы хотите сохранить то же самое number (это то, что делает регулярное выражение в этом ответе). Была ли опечатка ** 302 **? Если вы действительно хотите изменить номер, замените его на '$ _. Name -replace '^ (. *) (\ S +) ([^.] +)', '$ 2 $ 1 302''. –

0

Сделайте снимок.

gci *.pdf| %{ 
    $Name = $PSItem.Name.Split(' '); 
    $Dest = ('{0} {1} {2}' -f $Name[1], $Name[0], $Name[2]); 
    Move-Item $PSItem.FullName -Destination $Dest; 
}; 
+0

Этот не работает. Я получил сообщение об ошибке «Вы не можете вызывать метод с нулевым значением» в операторе split. – user3194848

+0

Какую версию PowerShell вы используете? '$ PSItem' является новым по сравнению с версией PowerShell версии 3.0, поэтому, если вы используете PowerShell версии 2.0, вам придется использовать' $ _' вместо '$ PSItem'. –

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