Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Frage Entwicklung Batch & Shell

Mitglied: fmerst

fmerst (Level 1) - Jetzt verbinden

20.03.2010, aktualisiert 16:32 Uhr, 4175 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.
 
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
Powershell - In Textdatei suchen und ersetzen (1)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst PowerShell Domain Join (2)

Frage von Patrick-IT zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell Hashtable to Übersichtliche Darstellung (2)

Frage von Marabunta zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...