mengubah nama file PowerShell dan file subfolder
Saya cukup baru mengenal PowerShell dan sekarang telah membaca terlalu banyak contoh dan menggoreng otak saya dengan contoh Get-ChildItem.
Saya memiliki struktur folder untuk film saya sebagai berikut
Films
├─Film1
| Film1Name.mp4
│ └─Subs
│ └─English.SRT
│
├─Film2
| Film2Name.mp4
│ └─Subs
│ └─English.SRT
|
├─Film3
| Film3Name.mp4
│ └─Subs
│ └─English.SRT
Apa yang saya coba capai adalah mengganti nama dan memindahkan file * .srt ke atas tingkat folder dan mengganti nama menjadi nama file film atau nama folder film dan memasukkan .ENG ke nama file .SRT sebelum ekstensi. Kemudian hapus folder 'Subs' yang tidak digunakan, dan lakukan ini secara rekursif.
Berakhir dengan yang berikut ini berdasarkan nama file
├─Film1
| Film1Name.mp4
│ Film1Name.ENG.SRT
atau ini berdasarkan nama folder
├─Film1
| Film1.mp4
│ Film1.ENG.SRT
Bantuan apa pun akan sangat dihargai, metode mana pun akan berhasil
Saya bermain dengan kode ini dari pos orang lain dan menghapus folder pengujian saya
$rootPath = "c:\Test" Get-ChildItem -Path $rootPath -Directory | ForEach-Object {
$targetFolder = $_.FullName
Resolve-Path "$targetFolder\*" | ForEach-Object { Move-Item -Path "$_\*.SRT" -Destination $targetFolder -Force Remove-Item -Path $_
}
}
Jawaban
Pertama, Anda ingin mendapatkan daftar semua direktori tingkat atas yang dinamai menurut "film" Anda setelah menyetel direktori root.
Set-Location -Path "Your directory path here"
$Films = Get-ChildItem -Directory
Setelah kita selesai melakukannya, kita mengulanginya masing-masing, dorong lokasi ke direktori itu dan periksa keberadaan folder bernama "Subs". Pop-Locationmengembalikan kita ke lokasi sebelumnya setelah melakukan apa yang perlu kita lakukan.
foreach ($Film in $Films) { Push-Location $Film
if ((Get-ChildItem -Directory).Name -contains "Subs") {
# Do stuff
}
Pop-Location
}
Jika kami menemukan direktori "Subs", kami ingin memeriksa keberadaan file ".SRT". Kami mungkin memiliki subtitle untuk berbagai bahasa.
$Subs = Get-ChildItem -Path *.srt -Recurse
Periksa apakah $Substidak nol.
if ($null -ne $Subs) { }
Pindahkan file ".SRT" ke lokasi saat ini dan ganti namanya seperti yang ditentukan.
foreach ($Sub in $Subs) {
$FilmPath = $Film.Fullname
$FilmName = $Film.Name
$SubtitleLang = $Sub.BaseName.Substring(0,3).ToUpper()
$Extension = $Sub.Extension
Move-Item -Path $Sub -Destination "$FilmPath\$FilmName.$SubtitleLang$Extension"
}
Jika Anda benar-benar yakin ingin menghapus folder "Subs", kami akan memeriksanya terlebih dahulu. Kita bisa menulis pesan jika masih ada file yang tersisa.
$RemainingFiles = Get-ChildItem -Path Subs -Recurse
if ($null -eq $RemainingFiles) {
Remove-Item -Path Subs -Force
}
else {
Write-Warning "There are still files in $($Film.FullName)\Subs"
}
Menyatukan semuanya
Set-Location -Path "Your directory path here"
$Films = Get-ChildItem -Directory # Loop through the Films foreach ($Film in $Films) { Push-Location $Film
if ((Get-ChildItem -Directory).Name -contains "Subs") {
# Find any SRT files in the "Subs" directory
$Subs = Get-ChildItem -Path Subs/*.srt -Recurse if ($null -ne $Subs) { foreach ($Sub in $Subs) { $FilmPath = $Film.Fullname $FilmName = $Film.Name $SubtitleLang = $Sub.BaseName.Substring(0,3).ToUpper() $Extension = $Sub.Extension Move-Item -Path $Sub -Destination "$FilmPath\$FilmName.$SubtitleLang$Extension"
}
}
}
# Remove the Subs folder
$RemainingFiles = Get-ChildItem -Path Subs -Recurse if ($null -eq $RemainingFiles) { Remove-Item -Path Subs -Force } else { Write-Warning "There are still files in $($Film.FullName)\Subs"
}
# Return to the root directory for the next folder.
Pop-Location
}
Sejauh yang saya mengerti, Anda tahu berapa banyak folder (Film) yang Anda miliki maka ini mungkin berfungsi:
1..3|ForEach {Copy-Item -Path C:\Films\Film$_\Subs\English.srt -Destination C:\Films\Film$_\Film$_.ENG.SRT} 1..3|ForEach {Remove-Item -Path C:\Films\Film$_\Subs -Recurse -Force}