2014-10-20 3 views
0

Я работаю над скриптом, чтобы переместить телешоу в соответствующую папку на моем диске. У меня проблемы с отображением их папок. Это фрагмент кода, который я имею проблему с:Соответствующие строки PowerShell с Regex

#Remove all non-alphanumeric characters from the name 
$newname = $Episode.Name -replace '[^0-9a-zA-Z ]', ' ' 

#Split the name at S01E01 and store the showname in a variable (Text before S01E01) 
$ShowName = [regex]::Split($newname, 'S*(\d{1,2})(x|E)')[0] 

#Match and get the destination folder where the names are similar 
################## THIS IS WHERE THE ISSUE IS ####################### 
$DestDir = Gci -Path $DestinationRoot | Where { $ShowName -like "*$($_.Name)*" } | foreach {$_.Name } 

К примеру, шоу под названием «Доктор Кто 2005 S02E02 Зуб и Claw.mp4» не возвращает аналогичную папку, которая названа «DoctorWho ».

Вопрос (и): Кому я могу изменить $ DestDir, чтобы соответствовать именам? Есть ли лучший способ сделать это?

Рабочий код: выход

# Extract the name of the show (text before SxxExx) 
$ShowName = [regex]::Split($Episode.Basename, '.(\d{1,3})(X|x|E|e)(\d{1,3})')[0] 

# Assumption: There is a folder in TV shows directory that is named correctly, and the input file is named correctly 
# Try to match by stripping all non-Alphabet characters from both names and check if the folder name contains the file name 
$Folder = gci -Path $DestinationRoot | 
      Where {$_.PSisContainer -and ` 
      (($_.Name -replace '[^A-Za-z]','') -match ($ShowName -replace '[^A-Za-z]','')) } | 
      select -ExpandProperty fullname 

Некоторые образцы из испытаний:

Input file name: Arrow S01E02.mp4 
Show name:   Arrow 
Matching folder: C:\Users\Public\Videos\TV Shows\Arrow 
----------------------------------------------------------------------- 
Input file name: Big Bang Theory S3E03.avi 
Show name:   Big Bang Theory 
Matching folder: C:\Users\Public\Videos\TV Shows\The Big Bang Theory 
----------------------------------------------------------------------- 
Input file name: Doctor Who S08E03.mp4 
Show name:   Doctor Who 
Matching folder: C:\Users\Public\Videos\TV Shows\Doctor Who (2005) 
----------------------------------------------------------------------- 
Input file name: GameOfThronesS01E01.mp4 
Show name:   GameOfThrones 
Matching folder: C:\Users\Public\Videos\TV Shows\Game Of Thrones 
----------------------------------------------------------------------- 
+0

Простите меня за то, что заявили очевидное, но почему бы вам просто не убедиться, что папки соответствуют именам шоу, то есть переименовать «DoctorWho» в «Doctor Who 2005»? PowerShell не знает, какова ваша идея «похоже», вам нужно будет рассказать о каждом отдельном случае. Одна вещь, которую вы можете сделать, это добавить '.Trim()', так что пробелы в начале и конце будут удалены, но вам придется явно прописать дальнейшие преобразования. –

+0

@JeroenMostert Это будет работать в моем случае. Тем не менее, я планировал поделиться этим с другими, как только закончил. Я не уверен, что они настраивают, поэтому я пытался сделать его максимально универсальным. –

+0

Ну, вы можете делать такие вещи, как «вычеркнуть все пробелы и конечные числа как в именах имен имен и папок, так и в начале совпадения», но кажется вероятным, что независимо от того, что вы делаете, кто-то будет жаловаться, что он не работает должным образом , По крайней мере, простые алгоритмы имеют то преимущество, что люди могут понять, что происходит. –

ответ

2

Используя тот же метод, как вы, чтобы выяснить, что название шоу основано на ваше предложение. С Doctor Who 2005 S02E02 Tooth and Claw.mp4

$showName = $Episode -replace '[^0-9a-zA-Z ]' 
$showName = ($showName -split ('S*(\d{1,2})(x|E)'))[0] 
$showName = $showName -replace "\d" 

Я добавил строку $showName = $showName -replace "\d" на счет за год в этом сезоне. Существует оговорка с этим, если шоу содержит число посередине, но должно работать для большинства. Продолжая определение $DestDir. Часть вопроса заключается в том, что у вас есть ваше сравнение Where. Вы хотите увидеть, является ли отображаемое имя частью потенциальной папки, а не наоборот. Кроме того, поскольку потенциальная папка может содержать пробелы, comaparison также должен содержать это предположение.

Get-ChildItem -Path $DestinationRoot -Directory | Where-Object { ($_.name -replace " ") -like "*$($showName)*"} 

Я бы на использовании Choice выбора, чтобы пользователь подтвердить папку, так как можно иметь несколько матчей. Я хотел бы отметить, что может быть сложно объяснить все соглашения об именах и отклонениях, но то, что у вас есть, - хорошее начало.

+0

Я закончил делать что-то похожее на то, что вы предложили. Я сделал список, а не как. Что касается выбора, я решил, что сценарий просто отправит электронное сообщение пользователю, сообщив им, что есть файлы, которые не совпадают, что потребует ручного вмешательства. Спасибо за помощь! –

+0

@Kevin_ '-contains' работает только для массивов. В 'where-object' вы не будете использовать массив. FYI – Matt

+0

Упс, предназначенный для того, чтобы сказать -match. –

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