J'essaie de convertir quelques milliers de vidéos personnelles dans un format plus petit. Cependant, l'encodage de la vidéo a changé l'horodatage créé et modifié à la date d'aujourd'hui. J'ai écrit un script PowerShell qui a fonctionné avec succès (d'une manière ou d'une autre) en écrivant l'horodatage modifié du fichier d'origine dans le nouveau fichier.

Cependant, je n'ai pas pu trouver un moyen dans PowerShell pour modifier l'horodatage "Media created" dans les propriétés de détails du fichier. Existe-t-il un moyen d'ajouter une routine qui copierait toutes les métadonnées du fichier d'origine ou au moins définirait le champ «média créé» à la date de modification?

Quand j'ai recherché des attributs de fichier, il semble que les seules options soient archive, caché, etc. Ci-joint le script PowerShell que j'ai créé (s'il vous plaît ne riez pas trop fort, haha). Merci

$filepath1 = 'E:\ConvertedMedia\Ingest\'                         # directory with incorrect modified & create date
$filepath2 = "F:\Backup Photos 2020 and DATA\Data\Photos\Photos 2021\2021 Part1\Panasonic 3-2-21\A016\PRIVATE\PANA_GRP\001RAQAM\"           # directory with correct date and same file name (except extension)                                                                
$destinationCodec = "*.mp4"                                      # Keep * in front of extension
$sourceCodec = ".mov"                                            
Get-ChildItem $filepath1 -File $destinationCodec | Foreach-Object {          # change *.mp4 to the extension of the newly encoded files with the wrong date  
    $fileName = $_.Name                                          # sets fileName variable (with extension)
    $fileName                                                    # Optional used during testing- sends the file name to the console
    $fileNameB = $_.BaseName                                     # sets fileNameB variable to the filename without extension
    $filename2 = "$filepath2" + "$fileNameB" + "$sourceCodec"    # assembles filepath for source
    $correctTime = (Get-Item $filename2).lastwritetime           # used for testing - just shows the correct time in the output, can comment out
    $correctTime                                                 # prints the correct time
    $_.lastwritetime = (Get-Item $filename2).lastwritetime       # modifies lastwritetime of filepath1 to match filepath2
    $_.creationTime = (Get-Item $filename2).lastwritetime        # modifies creation times to match lastwritetime (comment out if you need creation time to be the same)
    }

Mise à jour:

Je pense que j'ai besoin d'utiliser Shell.Application, mais j'obtiens un message d'erreur "Les clés en double" ne sont pas autorisées dans les littéraux de hachage " et je ne sais pas comment l'intégrer dans le script d'origine.

J'ai seulement besoin que l'attribut «date de modification» soit le même que «lastwritetime». Les autres champs ont été ajoutés uniquement pour les tests. J'apprécie ton aide!

$tags = "people; snow; weather"
$cameraModel = "AG-CX10"
$cameraMaker = "Panasonic"
$mediaCreated = "2/‎16/‎1999 ‏‎5:01 PM"


$com = (New-Object -ComObject Shell.Application).NameSpace('C:\Users\philip\Videos') #Not sure how to specify file type
$com.Items() | ForEach-Object {
    New-Object -TypeName PSCustomObject -Property @{
        Name = $com.GetDetailsOf($_,0)                  # lists current extended properties
        Tags = $com.GetDetailsOf($_,18)
        CameraModel = $com.GetDetailsOf($_,30)
        CameraMaker = $com.GetDetailsOf($_,32)
        MediaCreated = $com.GetDetailsOf($_,208)

        $com.GetDetailsOf($_,18) = $tags               # sets extended properties
        $com.GetDetailsOf($_,30) = $cameraModel
        $com.GetDetailsOf($_,32) = $cameraMaker
        $com.GetDetailsOf($_,32) = $mediaCreated
        
    }
} 

Exemple de script Fenêtre Propriétés du fichier

1
SprintUser 12 mars 2021 à 09:58

1 réponse

Meilleure réponse

Je pense que votre meilleure option est de piloter un outil / bibliothèque externe à partir de Powershell plutôt que d'utiliser le shell (pas sûr que vous puissiez réellement définir des valeurs de cette façon tbh).

Il est tout à fait possible d'utiliser FFMpeg pour définir les métadonnées Media Created d'un fichier comme celui-ci:

ffmpeg -i input.MOV -metadata creation_time=2000-01-01T00:00:00.0000000+00:00 -codec copy output.MOV

Cela copier le fichier input.MOV dans le nouveau fichier output.MOV et définir les métadonnées Media Created sur le nouveau output.MOV. C'est très inefficace - mais cela fonctionne.

Vous pouvez script ffmpeg quelque chose comme ci-dessous. Le script affichera actuellement les commandes FFMpeg à l'écran, la ligne commentée Start-Process peut être utilisée pour exécuter ffmpeg.

gci | where Extension -eq ".mov" | foreach {

    $InputFilename = $_.FullName;
    $OutputFilename = "$($InputFilename)-fixed.mov";

    Write-Host "Reading $($_.Name). Created: $($_.CreationTime). Modifed: $($_.LastWriteTime)";

    $timestamp = Get-Date -Date $_.CreationTime -Format O
            
    Write-Host "ffmpeg -i $InputFilename -metadata creation_time=$timestamp -codec copy $OutputFilename"

    # Start-Process -Wait -FilePath C:\ffmpeg\bin\ffmpeg.exe -ArgumentList @("-i $InputFilename -metadata creation_time=$timestamp -codec copy $($OutputFilename)")   
}
0
MisterSmith 13 mars 2021 à 21:40