Skrypt kopiujący pliki wideo do innego katalogu z jednoczesną zmianą nazwy

Po długich latach przyszedł czas i zawitałem w folderze „Zdjęcia”, który okazał się workiem bez dna z masą innych folderów z pod-folderami. Poruszanie się między katalogami w celu przeglądania i kopiowania odpowiednich plików w odpowiednie miejsce zabijało mi eksplorator systemu 🙁 W pierwszej kolejności przeindeksowałem na nowo folder ze zdjęciami, ale nie pomogło to za wiele, więc wpadłem na pomysł, by wszystkie filmy oddzielić od plików ze zdjęciami. Niestety ręczna robota nie wchodzi w grę, bo eksplorator mówi NIE! Z pomocą jak zawsze przychodzi PowerShell, przy pomocy którego udało mi się skomponować skrypt przenoszący pliki wideo z wybranego folderu do nowego, zmieniając ich nazwę na datę utworzenia (format RRRR_MM_DD). Skrypt obsługuje popularne formaty, jak .mp4, .avi, czy .mkv, a przy duplikatach dodaje licznik, by uniknąć nadpisania. Proste rozwiązanie dla porządku w plikach wideo!

P.S. teraz w końcu mogę spokojnie przeglądać zdjęcia 😉

Opis działania:

  1. Definiowanie ścieżek: Ustaw ścieżki do folderów źródłowego i docelowego.
  2. Definiowanie formatów: Lista popularnych formatów wideo, którą dmożna modyfikować według potrzeb.
  3. Iteracja po plikach: Skrypt przechodzi przez pliki wideo w każdym formacie.
  4. Pobranie daty utworzenia lub modyfikacji: Pobiera datę utworzenia z metadanych pliku; jeśli jest niedostępna, używa daty modyfikacji. Następnie konwertuje ją na format RRRR_MM_DD.
  5. Tworzenie poprawnej nazwy pliku: Używa daty oraz właściwego rozszerzenia pliku (np. .MOV).
  6. Unikanie nadpisywania: Jeśli plik o tej samej nazwie istnieje, dodaje licznik (_1, _2 itd.) do nazwy.
  7. Przeniesienie pliku: Plik jest przenoszony do folderu docelowego z nową nazwą.

Użycie

  • Podmień ścieżki w $sourceFolder i $destinationFolder na swoje lokalizacje.
  • Uruchom skrypt w PowerShell jako administrator.
# Ustaw ścieżki folderów źródłowego i docelowego
$sourceFolder = "C:\Sciezka\Do\FolderuZrodlowego"
$destinationFolder = "C:\Sciezka\Do\FolderuDocelowego"

# Definiuj popularne formaty plików wideo
$videoFormats = @("*.mp4", "*.avi", "*.mkv", "*.mov", "*.wmv", "*.flv", "*.mpeg", "*.mpg")

# Inicjalizacja obiektu Shell.Application
$shell = New-Object -ComObject Shell.Application
$folder = $shell.Namespace($sourceFolder)

# Funkcja pomocnicza do konwersji tekstu na datę
function ConvertTo-Date {
    param ($dateString)
    try {
        # Usunięcie zbędnych białych znaków i konwersja do typu DateTime
        $cleanDateString = $dateString -replace '[^\w\s:.-]', ''
        return [datetime]::Parse($cleanDateString)
    } catch {
        Write-Output "Nie można przekonwertować daty: $dateString"
        return $null
    }
}

# Iteruj przez każdy plik wideo w folderze źródłowym
foreach ($format in $videoFormats) {
    $files = $folder.Items() | Where-Object { $_.Name -like $format }
    
    foreach ($file in $files) {
        # Pobierz datę utworzenia lub datę modyfikacji, jeśli data utworzenia jest pusta
        $creationDate = $folder.GetDetailsOf($file, 208) # pozycja 208 data utworzenia
        if (-not $creationDate) {
            $creationDate = $folder.GetDetailsOf($file, 3) # pozycja 3 Data modyfikacji
        }

        # Konwersja daty na obiekt DateTime
        $creationDate = ConvertTo-Date -dateString $creationDate
        
        # Jeśli znaleziono datę, kontynuuj przetwarzanie
        if ($creationDate) {
            # Konwertuj datę na format RRRR_MM_DD
            $creationDateFormatted = $creationDate.ToString("yyyy_MM_dd")
            
            # Wydobądź rozszerzenie pliku
            $fileExtension = [System.IO.Path]::GetExtension($file.Name)

            # Utwórz nową nazwę pliku z datą utworzenia lub modyfikacji
            $newFileName = "$creationDateFormatted$fileExtension"
            
            # Ustal pełną ścieżkę docelową pliku
            $destinationPath = Join-Path -Path $destinationFolder -ChildPath $newFileName

            # Jeśli plik o takiej nazwie już istnieje, dodaj licznik, aby uniknąć nadpisania
            $counter = 1
            while (Test-Path -Path $destinationPath) {
                $newFileName = "$creationDateFormatted" + "_$counter" + "$fileExtension"
                $destinationPath = Join-Path -Path $destinationFolder -ChildPath $newFileName
                $counter++
            }

            # Przenieś plik do folderu docelowego z nową nazwą
            Move-Item -Path (Join-Path -Path $sourceFolder -ChildPath $file.Name) -Destination $destinationPath -Force
            Write-Output "Przeniesiono plik $($file.Name) jako $newFileName"
        }
        else {
            Write-Output "Nie można znaleźć daty utworzenia ani modyfikacji dla pliku $($file.Name)"
        }
    }
}

Output:

Efekt końcowy: (na czerwono zaznaczona pozycja 208 z datą, która jest brana jako pierwsza do nazywania pliku)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *