Ваш код почти готов, за исключением разбора файлов с _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
, чтобы фактически переместить файлы.