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

Frage Entwicklung Batch & Shell

Powershell - Elemente einer Auflistung nicht ansprechbar

Mitglied: fmerst

fmerst (Level 1) - Jetzt verbinden

20.03.2010, aktualisiert 16:32 Uhr, 4249 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
Microsoft

Letzte Updates für Win10 und Server2016 müssen bei Bedarf über den Update catalogue in den WSUS importiert werden!

Tipp von DerWoWusste vor 4 StundenMicrosoft1 Kommentar

automatisch kommt da nichts an im WSUS und auch nicht im SCCM. Siehe Hinweise zum Bezug der jeweils neuesten ...

Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 3 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 3 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 3 TagenSicherheit13 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Heiß diskutierte Inhalte
Netzwerkgrundlagen
IPv6 Inter-VLAN Routing
gelöst Frage von clSchakNetzwerkgrundlagen10 Kommentare

Hi ich befasse mich gerade mit der Implementierung von IPv6 was bisher (in einem VLAN) korrekt funktioniert inkl. DNS ...

SAN, NAS, DAS
Wer kennt sich mit QNAP und CISCO aus ?
gelöst Frage von MachelloSAN, NAS, DAS10 Kommentare

Hallo Zusammen hier im Forum, Ich habe ein QNas 451+ und dieses NAS hat zwei GBit Lan Adapter die ...

Windows Netzwerk
Ist ein Portforwarding auf einen PC ohne lauschendes Programm ein (großes) Sicherheitsproblem?
Frage von PluwimWindows Netzwerk9 Kommentare

Hallo zusammen, zur Fernwartung eines Rechners an einem anderen Ort nutze ich VNC. Da dieser Rechner einfach nur eine ...

Windows Netzwerk
Zugriff auf den Desktop Ordner eines anderen Rechners in der gleichen Domäne
gelöst Frage von JensNomaWindows Netzwerk6 Kommentare

Guten Abend, ich war neulich mit unserem Admin am Tisch gesessen. Er an seinem Notebook angemeldet mit dem Domänen-Admin, ...