
別のディレクトリにある MP4 ファイルのファイル サイズに基づいて、いくつかの MP4 ファイルの名前を変更しようとしています。サイズが同じすべてのファイルに同じ名前を付けたいのです。つまり、ソース ファイルのファイル サイズが比較ディレクトリのファイルのサイズと一致する場合、ソース ファイルは比較ファイルの名前と同じ名前に変更されます。両方のディレクトリを再帰的に読み取る必要があるため、DIR /s /b echo %%~zs>>filesizelist.txt コマンドを使用して、2 列の情報を持つ比較用リストを作成する方が簡単だと思います。次のようなリストが表示されます。
123456789 映画.mp4
987654321 映画2.mp4
次に、すべてのソース mp4 をバッチ ファイルに渡し、%%~za が最初の列の値と一致する場合は、ファイルを対応するファイル名に ren します。これが最善のパスでしょうか? オンザフライで動作するようにスクリプト化しようとしましたが、うまくいかず、3 日間の頭痛の種になりました (さらに、参照リストはほとんど変更されず、簡単に更新できることは明らかです)。スクリプトについて誰か助けてくれませんか?
答え1
以下の PowerShell スクリプトを参照してください。
私はこれを txt ファイルに対してのみテストしましたが、ファイル サイズ/長さが読み取り可能であれば、どのファイルでも機能するはずです。
$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 のパスをそれぞれのディレクトリに変更します。これは現在安全に実行でき、最初は変更は行われません。実行して結果に満足したら、rename-item 関数から "-Whatif" を削除できます。これにより、最初に実行したときに指定した変更が行われます。
これは非常に簡単な例であり、同じサイズの複数のファイル(重複するファイルなど)の処理方法は考慮されていません。親ディレクトリのみを処理し、再帰は行いません。