saabtam1
Goto Top

Videos mit kleiner Auflösung löschen

Guten Morgen zusammen,

ich habe ein Verzeichnis mit mehreren tausend Videodateien.
Hier möchte ich eine Bereinigung vornehmen, nämlich Videodateien löschen welche eine Bildbreite kleiner als 720 haben.

Ich habe schon mehrere Skripte gesehen, aber keines gefunden welche wo die Extension funktioniert bzw. wo es geschafft hat diesen Wunsch umzusetzen.


Könnt ihr mir helfen?


Vielen Dank im Voraus!


Grüße Robert

Content-ID: 7965769895

Url: https://administrator.de/contentid/7965769895

Printed on: October 10, 2024 at 05:10 o'clock

6376382705
6376382705 Jul 27, 2023 updated at 06:57:14 (UTC)
Goto Top
Hi.

[Erweiterte Dateieigenschaften mit Powershell-Funktion abfragen]

Hier mal ein Ansatz, damit dein Hirn nicht verstaubt:

Beispiel 2: Nur bestimmte Eigenschaften von Dateien ausgeben
Get-ChildItem "C:\Ordner" | Add-ExtendedFileProperties -PropertyExtended "Bildhöhe","Bildbreite" | select FullName,Bildhöhe,Bildbreite  

Kudos gehen an Kollege @colinardo für diesen Code.

Damit hast Du mal einen Anhaltspunkt, auf dem Du wunderschön aufbauen kannst.


Gruß
SAABTAM1
SAABTAM1 Jul 27, 2023 at 07:21:46 (UTC)
Goto Top
Guten Morgen emm386,

genau über diesen Beitrag stolpert man immer wieder wenn man über die Foreneigene Suchfunktion oder Google geht. Allerdings ist diese genau die Erweiterung, welche ich nicht zum laufen bekomme (ich bin auch nur ein absoluter Basic Scripter):


Add-ExtendedFileProperties : Die Benennung "Add-ExtendedFileProperties" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist...


Was mache ich falsch?
manuel-r
manuel-r Jul 27, 2023 at 07:27:47 (UTC)
Goto Top
Zitat von @SAABTAM1:
Add-ExtendedFileProperties : Die Benennung "Add-ExtendedFileProperties" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist...
Was mache ich falsch?

Nur mal ins Blaue: Du hast die Funktion die im genannten Beitrag vorgegeben ist aber schon in dein Script eingebaut?

Manuel
6376382705
6376382705 Jul 27, 2023 at 07:28:41 (UTC)
Goto Top
Was mache ich falsch?
Hast Du dir denn mal den verlinkten Thread angeschaut?

Natürlich musst Du die Funktion(die colinardo geschrieben hat in seinem Thread) erst einbauen, damit dein System die Funktion überhaupt aufrufen kann.

Ist doch eine schöne Methode um sich in Powershell einzuarbeiten bzw. einzulernen. PS wirst Du als Admin häufig nutzen (wollen). Erleichtert das IT-Leben enorm.

Add-ExtendedFileProperties : Die Benennung
Bitte Codetags nutzen für die Übersichtlichkeit, Danke Dir. face-smile

Gruß
7907292512
Solution 7907292512 Jul 27, 2023 updated at 08:26:05 (UTC)
Goto Top
Moin.
$shell = New-Object -com Shell.Application
Get-ChildItem "D:\Videos" -File -Filter *.mp4 -Recurse | ?{$shell.NameSpace($_.DirectoryName).ParseName($_.Name).ExtendedProperty("{64440491-4C8B-11D1-8B70-080036B11A03} 3") -lt 720} | remove-item -Force -Verbose  
Klappt aber nur mit Formaten die der Explorer auch als Videos erkennt. Wenn es sich also um Videos mit Dateiformaten handelt deren Auflösung der Explorer nicht auslesen kann musst du zu Drittanbieter-Tools wie z.B. mediainfo greifen.

Das ganze kannst du auch grafisch im Explorer erreichen indem du die erweiterte Filter-Syntax im Suchfeld des Explorers eintippst:
Bildbreite: < 720
Das zeigt dir im Ordner/Unterordner alle Videos mit einer Breite kleiner 720 Pixel
Referenz dazu hier: Advanced Query Syntax

Gruß siddius
SAABTAM1
SAABTAM1 Jul 27, 2023 at 08:43:50 (UTC)
Goto Top
@manuel-r & @6376382705: Mir war nicht bewusst wie. Ich bin tatsächlich davon ausgegangen wenn ich die einzelnen Codebestandteile in mein Skript übernehme, dass dieses völlig reicht. Nach der Fehlermeldung habe ich gemerkt das ich noch etwas "einbauen" muss, wusste aber nicht wie. Nun habe ich aber wie emm386 eine schöne Aufgabe das mal zu üben.

@siddus
Danke, das ist so spitze! Hat auf Anhieb funktioniert! Tausend Dank!


Liebe Grüße
Robert
SAABTAM1
SAABTAM1 Jul 27, 2023 at 09:19:32 (UTC)
Goto Top
Ich konnte mir, dank der Referenzierung von Siddius, die folgenden Kommandos ableiten:

## Videos mit einer Dateigröße kleiner als 5 MB werden gelöscht
$shell = New-Object -com Shell.Application
Get-ChildItem "A:\Videos" -File -Filter *.mp4 -Recurse | ?{$shell.NameSpace($_.DirectoryName).ParseName($_.Name).ExtendedProperty("{B725F130-47EF-101A-A5F1-02608C9EEBAC} 12") -lt 5000000} | remove-item -Force -Verbose  

## Videos mit einer Bildbreite kleiner als 640 werden gelöscht
$shell = New-Object -com Shell.Application
Get-ChildItem "A:\Videos" -File -Filter *.mp4 -Recurse | ?{$shell.NameSpace($_.DirectoryName).ParseName($_.Name).ExtendedProperty("{64440491-4C8B-11D1-8B70-080036B11A03} 3") -lt 640} | remove-item -Force -Verbose  

## Videos mit einer Bildbreite kleiner als 480 werden gelöscht
$shell = New-Object -com Shell.Application
Get-ChildItem "A:\Videos" -File -Filter *.mp4 -Recurse | ?{$shell.NameSpace($_.DirectoryName).ParseName($_.Name).ExtendedProperty("{64440491-4C8B-11D1-8B70-080036B11A03} 4") -lt 480} | remove-item -Force -Verbose    


Kennt einer noch einen Befehl um Videos mit einer Spieldauer von xx Minuten zu ermitteln?
7907292512
7907292512 Jul 27, 2023 updated at 09:39:15 (UTC)
Goto Top
## Videos mit einer Dateigröße kleiner als 5 MB werden gelöscht
Überflüssig , das bietet GetChildItem schon von Haus aus an, und kannst du alles in einem so kombinieren ohne die Files immer wieder durchlaufen zu müssen.
$shell = New-Object -com Shell.Application
Get-ChildItem "A:\Videos" -File -Filter *.mp4 -Recurse | ?{$shell.NameSpace($_.DirectoryName).ParseName($_.Name).ExtendedProperty("{64440491-4C8B-11D1-8B70-080036B11A03} 3") -lt 640 -or $shell.NameSpace($_.DirectoryName).ParseName($_.Name).ExtendedProperty("{64440491-4C8B-11D1-8B70-080036B11A03} 4") -lt 480 -or $_.Length -lt 5MB} | remove-item -Force -Verbose  
Außerdem ist das mehrfache Erzeugen des COM-Objektes Blödsinn, einmal reicht ...

Kennt einer noch einen Befehl um Videos mit einer Spieldauer von xx Minuten zu ermitteln?
Für das Löschen von Videos kleiner einer bestimmten Dauer:
[Windows.Storage.FileProperties.VideoProperties,Windows.Storage.FileProperties,ContentType=WindowsRuntime] | out-null

$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]  
Function Await($WinRtTask, $ResultType) {
    $asTask = $asTaskGeneric.MakeGenericMethod($ResultType)
    $netTask = $asTask.Invoke($null, @($WinRtTask))
    $netTask.Wait(-1) | Out-Null
    $netTask.Result
}

Get-ChildItem 'A:\Videos' -File -Filter *.mp4 | ?{  
    $file = Await ([Windows.Storage.StorageFile]::GetFileFromPathAsync($_.Fullname)) ([Windows.Storage.StorageFile])
    (Await $file.Properties.GetVideoPropertiesAsync() ([Windows.Storage.FileProperties.VideoProperties])).Duration -lt [timespan]'00:01:00'  
} | remove-item -Force -Verbose
SAABTAM1
SAABTAM1 Jul 27, 2023 at 09:57:35 (UTC)
Goto Top
Wieder was gelernt face-smile
SAABTAM1
SAABTAM1 Jul 27, 2023 at 10:50:42 (UTC)
Goto Top
Zitat von @7907292512:

## Videos mit einer Dateigröße kleiner als 5 MB werden gelöscht
Überflüssig , das bietet GetChildItem schon von Haus aus an, und kannst du alles in einem so kombinieren ohne die Files immer wieder durchlaufen zu müssen.
$shell = New-Object -com Shell.Application
Get-ChildItem "A:\Videos" -File -Filter *.mp4 -Recurse | ?{$shell.NameSpace($_.DirectoryName).ParseName($_.Name).ExtendedProperty("{64440491-4C8B-11D1-8B70-080036B11A03} 3") -lt 640 -or $shell.NameSpace($_.DirectoryName).ParseName($_.Name).ExtendedProperty("{64440491-4C8B-11D1-8B70-080036B11A03} 4") -lt 480 -or $_.Length -lt 5MB} | remove-item -Force -Verbose  
Außerdem ist das mehrfache Erzeugen des COM-Objektes Blödsinn, einmal reicht ...

Kennt einer noch einen Befehl um Videos mit einer Spieldauer von xx Minuten zu ermitteln?
Für das Löschen von Videos kleiner einer bestimmten Dauer:
[Windows.Storage.FileProperties.VideoProperties,Windows.Storage.FileProperties,ContentType=WindowsRuntime] | out-null

$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]  
Function Await($WinRtTask, $ResultType) {
    $asTask = $asTaskGeneric.MakeGenericMethod($ResultType)
    $netTask = $asTask.Invoke($null, @($WinRtTask))
    $netTask.Wait(-1) | Out-Null
    $netTask.Result
}

Get-ChildItem 'A:\Videos' -File -Filter *.mp4 | ?{  
    $file = Await ([Windows.Storage.StorageFile]::GetFileFromPathAsync($_.Fullname)) ([Windows.Storage.StorageFile])
    (Await $result.Properties.GetVideoPropertiesAsync() ([Windows.Storage.FileProperties.VideoProperties])).Duration -lt [timespan]'00:01:00'  
} | remove-item -Force -Verbose

Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In Zeile:35 Zeichen:5
+     (Await $result.Properties.GetVideoPropertiesAsync() ([Windows.Sto ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
7907292512
7907292512 Jul 27, 2023 updated at 10:58:56 (UTC)
Goto Top
Variablen-Tippfehler, ist behoben.
SAABTAM1
SAABTAM1 Jul 27, 2023 at 11:51:41 (UTC)
Goto Top
Danke! face-smile