Проблема с foreach + get-childitem - PullRequest
0 голосов
/ 20 декабря 2018

Я делаю скрипт для организации моих медиа.Я загружаю файлы в один каталог, чтобы разместить их перед добавлением в свой медиацентр.Если, например, у меня есть файл с именем Breaking.Bad.S01E01.DVDRip.XviD-ORPHEUS.avi, я бы хотел, чтобы скрипт получил название шоу, проверил сезон на S01 и переместил этот файл в папку на другом диске, например e:\series\breaking bad\season 01 Пока он проверяет,файл называется s01e01 или S01E01 или s01.e01 или S01.E01 и возвращает Breaking Bad \ Season 01, создает путь для перемещения и само действие перемещения

У меня есть часть этого сценария, но я не могу выполнитьget-childitem для работы с foreach.

Это то, что у меня есть, и ошибка, которую я получаю:

КОД

$FilesList = Get-ChildItem -name -recurse -include *.mkv,*.mp4,*.srt,*.avi
$FilesList

foreach ($FL_Item in $FilesList)
    {
    $SeriesName = ($FL_Item.BaseName -split '\.s\d')[0].Replace('.', ' ')
    $SE_Info = $FL_Item.BaseName.Split('.')[-3] -split 'e'`

    $Season = $SE_Info[0] -replace 's', 'Season '
    #$Episode = 'Episode{0}' -f $SE_Info[1]

    $SeriesName
    $Season
    #$Episode

    $SeriesDirectory = Join-Path -Path "$SeriesName" -ChildPath "$Season"
    $SeriesDirectory

    #$MoverArchivo = move-item -path $FileName -destination e:\series\$SeriesDirectory
    #$MoverArchivo

    ''
    }

ВЫВОД Я получаю

Breaking.Bad.S01E01.DVDRip.XviD-ORPHEUS.avi
Breaking.Bad.S01E01.DVDRip.XviD-ORPHEUS.spa.srt
Breaking.Bad.S04E01.Box.Cutter.720p.hdtv.x264-orenji.mkv
Breaking.Bad.S04E01.Box.Cutter.720p.hdtv.x264-orenji.spa.srt
Breaking.Bad.S05E15.720p.HDTV.x264-EVOLVE.mkv
Breaking.Bad.S05E15.720p.HDTV.x264-EVOLVE.spa.srt
Path Of Blood (2018) [WEBRip] [1080p] [YTS.AM]\Path.Of.Blood.2018.1080p.WEBRip.x264-[YTS.AM].mp4
They Shall Not Grow Old (2018) [BluRay] [1080p] [YTS.AM]\They.Shall.Not.Grow.Old.2018.1080p.BluRay.x264-[YTS.AM].mp4

ОШИБКА

You cannot call a method on a null-valued expression.
At D:\shared\temp\test3.ps1:8 char:5
+     $SE_Info = $FL_Item.BaseName.Split('.')[-3] -split 'e'
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Cannot index into a null array.
At D:\shared\temp\test3.ps1:10 char:5
+     $Season = $SE_Info[0] -replace 's', 'Season '
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray


Join-Path : Cannot bind argument to parameter 'Path' because it is an empty string.
At D:\shared\temp\test3.ps1:17 char:37
+     $SeriesDirectory = Join-Path -Path "$SeriesName" -ChildPath "$Sea ...
+                                        ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Join-Path], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.Join
   PathCommand

Есть идеи, что может быть не так?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я бы использовал RegEx с (именованными) группами захвата для поиска номеров серий, сезонов и эпизодов.
См. Работу RegEx в прямом эфире на regex101.com

## Q:\Test\2018\12\20\SO_53875674.ps1
$DstBase = "E:\series"
Get-ChildItem -Include *.mkv,*.mp4,*.srt,*.avi -Recurse -File|
  Where-Object BaseName -match "^(?<Series>.*?)\.?S(?<Season>\d{1,2})\.?E(?<Episode>\d{2})"|
    ForEach-Object {
      $Destination = "{0}\{1}\Season {2:00}\" -f $DstBase,$Matches.Series.replace('.',' ').Trim(),[int]$Matches.Season
      if (!(Test-Path $Destination)){MD $Destination -Force | Out-Null}
      "Moving file [{0}] to [{1}]" -f $_.FullName,$Destination
      $_ | Move-Item -Destination $Destination -Force
    }

Пример дерева (с указанными выше данными) после запуска скрипта:

> tree /F
└───series
    └───Breaking Bad
        ├───Season 01
        │       Breaking.Bad.S01E01.DVDRip.XviD-ORPHEUS.avi
        │       Breaking.Bad.S01E01.DVDRip.XviD-ORPHEUS.spa.srt
        │
        ├───Season 04
        │       Breaking.Bad.S04E01.Box.Cutter.720p.hdtv.x264-orenji.mkv
        │       Breaking.Bad.S04E01.Box.Cutter.720p.hdtv.x264-orenji.spa.srt
        │
        └───Season 05
                Breaking.Bad.S05E15.720p.HDTV.x264-EVOLVE.mkv
                Breaking.Bad.S05E15.720p.HDTV.x264-EVOLVE.spa.srt
0 голосов
/ 20 декабря 2018

Вы используете -name параметр Get-ChildItem в первой строке:

$FilesList = Get-ChildItem -name -recurse -include *.mkv,*.mp4,*.srt,*.avi

, что означает, что он вернет только имена файлов в виде строк.

Позжев вашем цикле вы получаете доступ к каждому элементу, используя свойство BaseName, которое является свойством FileInfo объектов, а не строк.Итак, $FL_Item.BaseName возвращает пустую строку, и вы получаете ошибки, как показано.

Просто удалите -name, и оно должно работать (или, по крайней мере, вы не получите эти ошибки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...