Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Powershell - Elemente einer Auflistung nicht ansprechbar

Mitglied: fmerst

fmerst (Level 1) - Jetzt verbinden

20.03.2010, aktualisiert 16:32 Uhr, 4271 Aufrufe

Hallo Community,
nach ersten guten Erfahrungen mit dieser Gruppe hier noch einmal eine hoffentlich interessante Frage

Ich habe einige Songs, die als MP3 mit 320kBit/s vorliegen.
Alle Songs haben ID3-Tags, also die Infos zu Album, Titel, Artist, etc..

Da auf der Speicherkarte meines Mobiles (zu) wenig Platz vorhanden ist, wollte ich die Songs verschlanken, nämlich auf 128kBit/s.
Lame macht das soweit ganz gut, leider gehen dabei die ID3-Tags verloren.

Mit Powershell unter Verwendung der TAGLIB (developer.novell.com/wiki/index.php/TagLib_Sharp)
gelingt es, die Tag Infos auszulesen und auch wieder zu schreiben. Leider ist der Code noch nicht so ganz "state of the art".

Daher folgende Frage:
Das Object $media enthält zur Laufzeit die aktuell im Zugriff befindliche MP3-Datei. Mit $media.tag wird auf die Auflistung aller ID3-Tags zugegriffen.
Unter Verwendung namentlicher Benennung, (siehe im Code z.B. Zeilen 62-65) also z.B. $media.tag.ARTIST oder $media.tag.TITEL läßt sich auch alles verarbeiten.
Jedoch ist das sehr umständlich. Für jede Aktion (Auslesen/Schreiben) ist jedes Tag einzeln zu referenzieren. Auch ist bei der namentlichen Benennung nie ausgeschlossen,
dass eines dieser Tags übersehen oder vergessen wird.
Wie kann man die Verarbeitung in eine ordentliche Zeile Code packen, in der jedes dieser Tags über seien Index in $media.tag angesprochen wird.
Ziel ist es:

- Alle Tags eines Songs auslesen und in Variable(n) zu speichern
- Dann mit Lame aus dem Song eine neue Daei erzeugen, die nur 128kBit/S hat
- Abschließend der neuen Datei die Tags, die ja in der/den Variable(n) gespeichert sind, wieder zufügen.


Mein Ansatz war: Erstellen von Variblen, deren Name aus einem Präfix ($lv_) und dem Namen des Tags (z.B. Artist) besteht, also $lv_Artist. Leider geling mir das nicht.
Im Code zeigt zwar $tag_prop zur Laufzeit mit "ARTIST" oder "TITEL" das gewünschte Tag, aber es läßt sich nicht zur weiteren Verwendung nutzen.
Eine Zeile wie: $testen = get-variable $tag_prop -valueonly
liefert Fehler der Art: Get-Variable : Es kann keine Variable mit dem Namen "Microsoft.PowerShell.Commands.Internal.Format.FormatStartData" gefunden werden.

Wer kann mit einer guten Idee helfen?

Vielen Dank für Eure Bemühungen.




Anbei der Code, wie er bisher gedieen ist:

01.
 
02.
$TagLib = "C:\Programme Sourcen\ID3_TagLib\taglib-sharp-2.0.3.4-windows\Libraries\taglib-sharp.dll" 
03.
[void][System.Reflection.Assembly]::LoadFile($TagLib) 
04.
 
05.
$ZielDir = "E:\Songs 128 kbit" 
06.
$LameDir = "C:\Program Files\Audiograbber" 
07.
 
08.
 
09.
foreach ($ordner in get-childitem "E:\songs\00_to_be_converted" -recurse -filter *. | ? { $_.PSisContainer -eq $true} )  
10.
    # ------------------------------------------------------------------------------------ 
11.
    # schleife über alle Ordner des Quell-Pfades 
12.
    # ------------------------------------------------------------------------------------ 
13.
 
14.
15.
	 
16.
    foreach ($file in Get-Childitem $ordner.FullName -filter *.mp3 ) 
17.
    
18.
    # ------------------------------------------------------------------------------------ 
19.
    # schleifeüber alle mp3 dateien des ordners 
20.
    # ------------------------------------------------------------------------------------ 
21.
     
22.
23.
             
24.
      $currentfile = $ordner.FullName + "\" + $file 
25.
            
26.
      # --------------------------------------------- 
27.
      # für das file nun das Tag Objekt erstellen  
28.
      $media = [TagLib.File]::Create( $currentfile ) 
29.
      # --------------------------------------------- 
30.
       
31.
      # jetzt die tags des files auslesen 
32.
       
33.
      foreach ($xx in $media.tag) 
34.
                # ------------------------------------------------------------------------------------ 
35.
                # tags der mp3 datei auslesen 
36.
                # ------------------------------------------------------------------------------------ 
37.
 
38.
39.
                        # listet die namen aller TagMembers auf - also zB. "Titel", "Album", "Artist" , .... 
40.
                        # das Format-Table (abgekürzt ft) funktioniert nur, weil der initialisierung der TAGLIB (allererste Zeilen dieses Skriptes) 
41.
                        # ein [void] vorangestellt wurde. Dessen Bedeutung ist (noch) gesondert (zu) erörtern. 
42.
                        # http://www.vistax64.com/powershell/31473-format-table-error.html 
43.
                        # ------------------------------------------------------ 
44.
                        # $media.tag | get-member -MemberType Property | ft name 
45.
                        # ------------------------------------------------------ 
46.
                        # mit der so gewonnenen Info können jetzt die Elemente unter Verwendung dynamischer variblen gezielt abgefragt /  
47.
                        # bzw. gespeichert werden. 
48.
                                            
49.
                    
50.
                        foreach ($tag_prop in $media.tag | get-member -MemberType Property | ft name  ) 
51.
                        
52.
                          
53.
			# infos der Tags können nun abgefragt werden 
54.
	                'Composers                : '   + $media.tag.Composers                 
55.
        	        'ComposersSort            : '   + $media.tag.ComposersSort             
56.
                	'TitleSort                : '   + $media.tag.TitleSort                 
57.
	               	'AlbumSort                : '   + $media.tag.AlbumSort     
58.
                        # und viele mehr 
59.
 
60.
		 
61.
			# infos der Tags sollen in Variable zwischengepuffert werden 
62.
                        if ($media.tag.Composers -ne '') {$lv_Composers = $media.tag.Composers} else {$lv_Composers = ''} 
63.
                	if ($media.tag.ComposersSort -ne '') {$lv_ComposersSort = $media.tag.ComposersSort} else {$lv_ComposersSort = ''} 
64.
                	if ($media.tag.TitleSort -ne '') {$lv_TitleSort = $media.tag.TitleSort} else {$lv_TitleSort = ''} 
65.
                	if ($media.tag.AlbumSort -ne '') {$lv_AlbumSort = $media.tag.AlbumSort} else {$lv_AlbumSort = ''} 
66.
               		# und viele mehr 
67.
                 
68.
69.
                                 
70.
                # variable rücksetzen, damit kein versehentlicher Zugriff auf Tags des Original-Files erfolgt 
71.
                $media = '' 
72.
                 
73.
                # ------------------------------------------------------------------------------------ 
74.
75.
                # prüfen, ob Name für Zieldatei bereits belegt, 
76.
                #          falls ja: 
77.
                #          dem Namen für Zieldatei ein Datums-String zufügen 
78.
79.
                # ------------------------------------------------------------------------------------ 
80.
                    
81.
                $Date = get-date -uformat "%Y%m%d-%H%M%S"  
82.
                 
83.
                $File_To_Be_Tagged = $ZielDir + "\" + $file 
84.
                $testfile = $File_To_Be_Tagged 
85.
                $extension = $file.Extension 
86.
                 
87.
                # loop bis Namen für Zieldatei noch nicht belegt 
88.
                while (test-path $testfile) 
89.
90.
                $Date = get-date -uformat "%Y%m%d-%H%M%S"  
91.
                # Achtung GetFileNameWithoutExtension extrahiert auch den Pfad. 
92.
                # Also: Hinterher den Pfad einfach wieder voranstellen 
93.
                $testfile = [IO.Path]::GetFileNameWithoutExtension($File_To_Be_Tagged) + "_" + $date + $extension 
94.
                $testfile = $ZielDir + "\" + $testfile 
95.
96.
                 
97.
                # falls Namen für Zieldate belegt war: nehme die Version, an der Datum zugefügt war 
98.
                if  ($File_To_Be_Tagged -ne $testfile)  
99.
100.
                     $File_To_Be_Tagged = $testfile 
101.
                     # setze variable $testfile zurück 
102.
                     $testfile ='' 
103.
104.
                              
105.
                # ------------------------------------------------------------------------------------ 
106.
107.
                # mit lame runterdampfen und dabei in das 128 kb/s verzeichnis kopieren  
108.
                #  
109.
                # ------------------------------------------------------------------------------------ 
110.
                 
111.
                $Programm = """" +$LameDir + "\lame.exe" + """"  
112.
                $ProgrammArguments = " -b 128 -h " + """" + $currentfile + """" + "  " +  """" + $File_To_Be_Tagged + """" 
113.
                                 
114.
                $programm 
115.
                $ProgrammArguments 
116.
                 
117.
                # Lame aufrufen    
118.
                # -wait zwingt Schleife zu warten, bis das externe Programm (=lame) beendet ist              
119.
                Start-Process -filepath $Programm -ArgumentList $ProgrammArguments -wait 
120.
             
121.
      		# ---------------------------------------------- 
122.
      		# für das neue file nun das Tag Objekt erstellen  
123.
      		$media = [TagLib.File]::Create( $currentfile ) 
124.
      		# ---------------------------------------------- 
125.
                $File_To_Be_Tagged = $ZielDir + "\" + $file  
126.
                #  tag-objekt für neues file öffnen 
127.
                "Neues Tag Objekt= " + $File_To_Be_Tagged 
128.
                $media = [TagLib.File]::Create($File_To_Be_Tagged) 
129.
                                  
130.
                # ------------------------------------------------------------------------------------ 
131.
132.
                # dem NEUEN file jetzt die ALTEN tags überbraten  
133.
                #  
134.
                # ------------------------------------------------------------------------------------ 
135.
            
136.
                if ($lv_Composers -ne '') {$media.tag.Composers = $lv_Composers}  
137.
                if ($lv_ComposersSort -ne '') {$media.tag.ComposersSort = $lv_ComposersSort}  
138.
                if ($lv_TitleSort -ne '') {$media.tag.TitleSort = $lv_TitleSort}  
139.
                if ($lv_AlbumSort -ne '') {$media.tag.AlbumSort = $lv_AlbumSort}  
140.
		# und viele mehr 
141.
                 
142.
                
143.
                #  tags im neuen File speichern 
144.
                $media.Save() 
145.
      
146.
     }  # ende von foreach $file 
147.
 
148.
}  # ende von foreach $ordner 
149.
 
Ähnliche Inhalte
Batch & Shell
PowerShell - Finden eines Array Elements
gelöst Frage von derhoeppiBatch & Shell2 Kommentare

Hallo, es gibt Sachen, die man schon mehrmals getan hat, aber es will einfach nicht funktionieren. Ich habe ein ...

Batch & Shell
Powershell XML elemente hinzufügen
gelöst Frage von H41mSh1C0RBatch & Shell3 Kommentare

Hi@PS Profi's Variante 1: Variante2: Was macht sich besser beim Zugriff auf die Elemente? Variante 1 bekomme ich in ...

Batch & Shell
PowerShell Array Elemente entfernen
gelöst Frage von derhoeppiBatch & Shell1 Kommentar

Guten Morgen, ich habe zwei Arrays. Eines ist mehrdimensional und das andere einfach. Das mehrdimensionale soll um die Werte ...

Batch & Shell
PowerShell Array Elements zum String
gelöst Frage von derhoeppiBatch & Shell1 Kommentar

Hallo, ich stehe vor folgender Herausforderung. Nachdem ich nun erfolgreich zwei Arrays vergleichen kann in dem ganze Zahlen stecken, ...

Neue Wissensbeiträge
iOS
Updates für Iphone und Co
Information von sabines vor 2 StundeniOS

Gestern abend ist iOS 11.3.1 erschienen, ein kleineres Update, dass einige Lücken schließt und "Lahmlegen" nach einem Display Tausch ...

Windows 7

Windows 7 - Server 2008 R2: Exploit für Total Meltdown verfügbar

Information von kgborn vor 1 TagWindows 7

Kleine Information für Administratoren, die für die Updates von Windows 7 SP1 und Windows Server 2008 R2 SP1 verantwortlich ...

Sicherheit

Zero Day-Schwachstelle im Internet Explorer - wird von APT bereits ausgenutzt

Information von kgborn vor 1 TagSicherheit

Im Kernel des Internet Explorer scheint es eine Zero Day-Lücke zu geben, die von staatlichen Akteuren (APT) im Rahmen ...

Microsoft
Folder Security Viewer-Lizenzen zu gewinnen
Information von kgborn vor 1 TagMicrosoft

Ich nehme das Thema mal in Absprache mit Frank hier auf, da es für den einen oder anderen Administrator ...

Heiß diskutierte Inhalte
C und C++
Frage1 C Programmierung-Makefile Frage2 PHP-Programmierung HTTP-Fehler 404
Frage von KatalinaC und C++27 Kommentare

Hallo, ich habe 2 Fragen, die nichts miteinander zu tun haben aber mit denen ich mich gerade beschäftige: 1. ...

Linux
Linux Server oder Windows Server - lohnt eine Umstellung auf Linux und ebenso basierende SW bei einer langfristigen Planung?
Frage von motus5Linux27 Kommentare

Wir brauchen bei uns einen neuen Server. Dieser wird als Fileserver, Domäne Controller sowie Exchange Server verwendet. Wir versuchen ...

LAN, WAN, Wireless
Watchguard T15 VPN Einrichtung
gelöst Frage von thomasjayLAN, WAN, Wireless25 Kommentare

Hallo zusammen, wir möchten gerne über unsere Watchguard T15 einen VPN-Tunnel (Mobile VPN with IPSec) einrichten! Als Client nutzen ...

DSL, VDSL
ISP Wechsel auf Vodefone Koax, Gebäudeverkabelung nur per Cat 7
gelöst Frage von wusa88DSL, VDSL19 Kommentare

Hallo Zusammen, ich bin momentan bei Mnet als Glasfaser Kunde und möchte Preis/Leistungs-Technisch zu Kabel Deutschland / Vodafone wechseln. ...