Я работаю над скриптом, чтобы переместить телешоу в соответствующую папку на моем диске. У меня проблемы с отображением их папок. Это фрагмент кода, который я имею проблему с:Соответствующие строки 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
-----------------------------------------------------------------------
Простите меня за то, что заявили очевидное, но почему бы вам просто не убедиться, что папки соответствуют именам шоу, то есть переименовать «DoctorWho» в «Doctor Who 2005»? PowerShell не знает, какова ваша идея «похоже», вам нужно будет рассказать о каждом отдельном случае. Одна вещь, которую вы можете сделать, это добавить '.Trim()', так что пробелы в начале и конце будут удалены, но вам придется явно прописать дальнейшие преобразования. –
@JeroenMostert Это будет работать в моем случае. Тем не менее, я планировал поделиться этим с другими, как только закончил. Я не уверен, что они настраивают, поэтому я пытался сделать его максимально универсальным. –
Ну, вы можете делать такие вещи, как «вычеркнуть все пробелы и конечные числа как в именах имен имен и папок, так и в начале совпадения», но кажется вероятным, что независимо от того, что вы делаете, кто-то будет жаловаться, что он не работает должным образом , По крайней мере, простые алгоритмы имеют то преимущество, что люди могут понять, что происходит. –