Изолировать похожие имена файлов в массиве для дополнительной обработки - PullRequest
1 голос
/ 30 января 2020

У меня есть небольшой скрипт, который сортирует видеофайлы по их разрешению. Однако некоторые файлы имеют одно и то же видео, но в разных разрешениях. Их имена совпадают, за исключением двух дополнительных символов после одного из имен файлов. то есть Stream12345.ts и Stream12345_2.ts. Я хочу найти эти похожие файлы в массиве и обработать их в отдельной папке «Duplicate -» + $ METAMediaFrameHieght, но не могу определить, где в сценарии или логах c сделать это.

$VideoExtensions = ('.mp4','.ts')
$Files = Get-ChildItem -LiteralPath $PSScriptRoot | Where-Object {$_.Extension -in $VideoExtensions}
FOREACH ($file in $Files)
{
  $Shell = New-Object -COMObject Shell.Application
  $Folder = Split-Path $file.FullName
  $ShellFolder = $Shell.NameSpace($Folder)
  $ShellFile = $ShellFolder.ParseName($file)

  $METAMediaFrameHieght = $ShellFolder.GetDetailsOf($ShellFile, 314)

  New-Item $PSScriptRoot\$METAMediaFrameHieght -Type Directory -Force | Out-Null
  Move-Item -LiteralPath $file.FullName -Destination $PSScriptRoot\$METAMediaFrameHieght
}

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Ваш код почти готов, за исключением разбора файлов с _number в конце BaseName, и после этого не происходит очистки для удаления объектов COM из памяти.

Это должно делать то, что нужно Вы хотите:

$Shell = New-Object -COMObject Shell.Application
$VideoExtensions = ('.mp4','.ts')
Get-ChildItem -LiteralPath $PSScriptRoot | 
    Where-Object {$_.Extension -in $VideoExtensions -and $_.BaseName -match '_\d+$'} |
    ForEach-Object {
        $ShellFolder = $Shell.NameSpace($_.DirectoryName)
        $ShellFile   = $ShellFolder.ParseName($_.Name)
        $frameHeight = $ShellFolder.GetDetailsOf($ShellFile, 314)
        $destination = Join-Path -Path $PSScriptRoot -ChildPath $frameHeight
        # test if the destination path exists and if not, create it
        if (!(Test-Path -Path $destination -PathType Container)) {
            $null = New-Item -Path $destination -ItemType Directory -Force
        }
        # move the file
        $_ | Move-Item -Destination $destination -WhatIf
}

# Clean up COM objects
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ShellFile)   | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ShellFolder) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Shell)       | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

Если вы удовлетворены информацией, отображаемой в консоли, вы можете удалить переключатель -WhatIf, чтобы фактически переместить файлы.

0 голосов
/ 30 января 2020

Вы можете использовать фильтр Regex для захвата всех файлов, которые имеют _number.ts или _number.mp4.

$Files = Get-ChildItem -LiteralPath $PSScriptRoot | Where-Object {$_.Extension -in $VideoExtensions}

$FilesToMove = $Files | ? {$_.Name -match "(_\d*.(ts|mp4)$)" }

if ($FilesToMove){
    $FilesToMove | Move-Item -Path $_.FullName -Destination destPath 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...