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, 4341 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 bestimmtes XML Element auslesen

gelöst Frage von H41mSh1C0RBatch & Shell6 Kommentare

Hi@PS Profi's, Ein Entry ist wiefolgt aufgebaut: Wenn ich nun im Datagrid mir eine Zeile aussuche will ich mir ...

Batch & Shell

Powershell bestimmtes XML Element entfernen

gelöst Frage von H41mSh1C0RBatch & Shell4 Kommentare

Hi@PS Profi's, ich versuche gerade ein bestimmtes XML Element zu löschen mit dem Attibute name=Test. Hier kommt er mit ...

Datenbanken

Stücklisten Auflistung MSSQL

Frage von rolandgggDatenbanken6 Kommentare

Hallo! Ich habe folgendes Problem: Ich habe im Artikelstamm (Part$Product_2_1) die Artikel des ERP Systems. Zu jedem Produktionsartikel gibt ...

Webentwicklung

CSS Menü Child-Element verändert Größe von Eltern-Element

Frage von CenionWebentwicklung

Hallo zusammen, ich kämpfe jetzt seit einigen Stunden mit dem CSS unseres Menüs. Dieses ist mit den Jahren gewachsen, ...

Neue Wissensbeiträge
Windows 7
Updategängelung auf Windows 10, die zweite
Information von Penny.Cilin vor 2 TagenWindows 7

Hallo, da Windows 7 im kommenden Jahr nicht mehr supportet wird, werden Nutzer von Window 7 home premium wieder ...

Internet
EU-Urheberrechtsreform: Zusammenfassung
Information von Frank vor 4 TagenInternet1 Kommentar

Auf golem.de gibt es eine Analyse von Friedhelm Greis, der das Thema EU-Urheberrechtsreform gut und strukturiert zusammenfasst. Zwar haben ...

Microsoft Office

Office365 Schwachstellen bei Sicherheit und Datenschutz

Information von Penny.Cilin vor 5 TagenMicrosoft Office7 Kommentare

Auf Heise+ gibt es einen Artikel bzgl. Office365 Schwachstellen. Das ist noch ein Grund mehr seine Daten nicht in ...

Sicherheit
Schwachstellen in VPN Clients
Tipp von transocean vor 7 TagenSicherheit2 Kommentare

Moin, es gibt Sicherheitslücken bei VPN Clients namhafter Hersteller, wie man hier lesen kann. Gruß Uwe

Heiß diskutierte Inhalte
Windows Installation
Windows10 Home Neuinstallation - Raketentechnik
Frage von spacyfreakWindows Installation13 Kommentare

"Kannst du den Rechner von der Tante von WindowsXP auf Windows10 Home upgraden" haben sie gefragt? "Sicher, was kann ...

Utilities
Teamviewer 9.x "out of date" ??
gelöst Frage von keine-ahnungUtilities12 Kommentare

Moin at all, mein topaktueller teamviewer (alles 9.x - releases) verweigert seit heute die Arbeit und bemeckert: "the remote ...

Windows 10
Windows 10 verwendet FritzBox per IPv6 als DNS-Server an Stelle des per DHCP vergebenen DNS-Servers
Frage von Datax87Windows 1010 Kommentare

Hallo, ich habe ein kleines Problem mit der Namensauflösung (DNS) unter Windows 10. Mir ist heute aufgefallen, dass ich ...

Peripheriegeräte
Empfehlung für Home-USV (ca. 450VA 270W) Irgendwelche Osterpreisaktionen bekannt?
Frage von Server-NutzerPeripheriegeräte9 Kommentare

Hallo und schöne Ostern. Meine private Heim-USV Yunto Q450 (ca. 450VA 270W) hat sich nach vielen Jahren ohne Probleme ...