Попытка переименовать файлы в зависимости от размера файла

272
DeAnthony

Я пытаюсь переименовать некоторые файлы MP4 в зависимости от размера файла mp4 в другом каталоге. Я хочу назвать все файлы с одинаковыми размерами для одного и того же имени. Это означает, что если размер файла исходного файла совпадает с размером файла в каталоге сравнения, исходный файл переименовывается в любое имя для сравниваемого файла. Поскольку оба каталога необходимо читать рекурсивно, я думаю, что было бы проще составить список для сравнения с информацией в нем в 2 столбцах, используя команду DIR / s / b echo %% ~ zs >> filesizelist.txt, давая мне список как

123456789 movie.mp4

987654321 movie2.mp4

Затем передайте все исходные mp4s в пакетный файл и, если %% ~ za совпадет со значением в первом столбце, затем перенесите файл в соответствующее имя файла. Это лучший путь? Я попытался написать сценарий так, чтобы он работал на лету, и это было неактивным и источником моей 3-дневной головной боли (плюс список ссылок редко меняется и, очевидно, легко обновляется). Может кто-нибудь помочь мне с сценарием?

0
Have you considered powershell? Whilst I can see it should be possible via batch I still think powershell would be less work and would achieve exactly what you want with future possiblities... CraftyB 5 лет назад 0
Thank you for the quick reply. I thought about powershell, but I am thoroughly unfamiliar with it. I can comprehend, but which commands should I research to try to write said script? DeAnthony 5 лет назад 0

1 ответ на вопрос

0
CraftyB

Пожалуйста, смотрите ниже скрипт powershell.

Я проверил это только для текстовых файлов, но он должен работать с любым файлом при условии, что размер / длина файла читаема.

$Source = "C:\Test" $Comparison = "C:\Test2"  $SourceFiles = Get-ChildItem -File -Path $Source | Select * $ComparisonFiles = Get-ChildItem -File -Path $Comparison | Select *  Foreach ($File in $SourceFiles){ Write-Host "Checking for" $File.Name Foreach ($CFile in $ComparisonFiles){ if ($File.length -eq $CFile.length){ Write-host $File.fullname "Matches `n" $CFile.fullname Rename-Item -Path $File.FullName -NewName $CFile.Name -WhatIf Write-Host "`n" }  } } 

Измените пути $ Source и $ Comparison к их соответствующим каталогам, в настоящее время это безопасно для запуска и изначально не вносит никаких изменений. После того, как вы запустили его и остались довольны результатами, вы можете удалить «-Whatif» из функции переименования элемента, и это внесет изменения, указанные при первом запуске.

Это очень быстрый пример, и он не учитывает, как обрабатывать несколько файлов одинакового размера (возможны дубликаты файлов и т. Д.), Это только делает родительский каталог, а не рекурсивный.

Спасибо. Я проверю и доложу, как только получу энергию, так как ураган уничтожил мою. Я думаю, что могу немного прочитать о Powershell, чтобы сделать его рекурсивным. Спасибо за старт! DeAnthony 5 лет назад 0
Работает отлично! Бесконечно благодарен! После небольшого исследования я добавил - повторяйте после сравнения $ source и $ для достижения всех моих целей (для всех, кто читает этот вопрос с похожими целями). Я думаю, что скобки, возможно, сломали это, так как он потерпел неудачу на двух файлах, но как только я удалил [дерьмо] из имени файла, он выполнил хорошо. Я могу исправить это вручную, но я думаю, что сделаю больше исследований PowerShell, чтобы найти виновника. Элегантный простой сценарий, который вы написали. Еще раз спасибо! DeAnthony 5 лет назад 0