mengubah nama file PowerShell dan file subfolder

Aug 26 2020

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

1 Ash Aug 26 2020 at 10:57

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
}
Adis1102 Aug 26 2020 at 10:53

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}