2012-06-27 6 views
0

У меня есть некоторые файлы, которые я хотел бы переименовать с помощью regex и powershell, но я не уверен в шаблонах для файлов.Переименование частей имени файла с помощью regex и powershell

Пример имен файлов Мне нужно переименовать и что они должны выглядеть так. ps помещает имена в «» для учета пробелов.

Как файлы называются в настоящее время

«[абс] anima.some название E147 [480p] .avi»
«anima.some Имя E147 #anim группы .avi»
«Анима. некоторые названия E147 [480p] .avi»
„анима некоторое имя E147 [480p] .avi“

Как они должны быть имя

«Аниме некоторые e147.avi»

+0

Powershell фактически не способен обрабатывать имена файлов с '[]' в них, так вам нужно будет сделать больше, чем просто переименование и регулярное выражение, например, использовать некоторые .NET-классы. – SpellingD

+0

Спасибо за информацию, если вы можете сделать эту работу с помощью .NET в Powershell, что было бы приемлемым решением. – justinf

ответ

1

Как это:

# Create array of filenames 
$files = 
"[abs] anima.some e147 name [480p].avi", 
"anima.some e147 name #anim group .avi", 
"anima.some e147 name [480p].avi", 
"anima some e147 name [480p].avi" 

# Setup patterns to match against 
$pattern1 = "\[\w+\] ([^.]+).([\w]+) ([\S]+) [\w]+ \[[\w]+\].avi" 
$pattern2 = "([^.\s]+).([\w]+) ([\S]+) .*.avi" 

# Loop through file names and attempt matching 
foreach($f in $files) 
{ 
    if($f -match $pattern1) 
    { 
     $string = (Get-Culture).TextInfo.ToTitleCase($matches[1]) + " " + $matches[2] + " " + $matches[3] + ".avi" 
     $string 
    } 
    elseif($f -match $pattern2) 
    { 
     $string = (Get-Culture).TextInfo.ToTitleCase($matches[1]) + " " + $matches[2] + " " + $matches[3] + ".avi" 
     $string 
    } 
    else 
    { 
     "unmatched file: " + $f 
    } 
} 

Выход:

Anima some e147.avi 
Anima some e147.avi 
Anima some e147.avi 
Anima some e147.avi 
+0

Большое спасибо, что это сработало 100% за то, что я хотел, чтобы он пробил его до кода m, и теперь он работает, теперь я купил книгу по регулярному выражению, так что узнаю об этом. Просто вопрос, который я никогда не использовал Get-Culture, что он на самом деле делает, я проверил helphell help и на самом деле не объяснил это. – justinf

+0

Get-Culture возвращает объект System.Globalization.CultureInfo. Этот объект имеет свойство TextInfo, которое предоставляет метод ToTitleCase(). Этот метод является просто удобным инструментом для взятия строки типа «rAmdoN cAse» и изменения ее на «Случайный случай». –