Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

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

Frage Entwicklung Batch & Shell

Mitglied: fmerst

fmerst (Level 1) - Jetzt verbinden

20.03.2010, aktualisiert 16:32 Uhr, 4230 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
JavaScript
gelöst Per URL ein Element ausblenden (1)

Frage von Peter32 zum Thema JavaScript ...

JavaScript
gelöst Per JavaScript ein ID-Element schließen (9)

Frage von Peter32 zum Thema JavaScript ...

Batch & Shell
gelöst Csproj mit powershell ändern (8)

Frage von Sirius91 zum Thema Batch & Shell ...

HTML
Wie kann man Elemente ausklappen? (2)

Frage von Yanmai zum Thema HTML ...

Neue Wissensbeiträge
Viren und Trojaner

Ransomware or Wiper? RedBoot Encrypts Files but also Modifies Partition Table

Information von BassFishFox zum Thema Viren und Trojaner ...

Notebook & Zubehör

WOL bei HP Notebooks

(6)

Erfahrungsbericht von Henere zum Thema Notebook & Zubehör ...

LAN, WAN, Wireless

Neue Cisco Catalyst-Serie 9000

Information von Kuemmel zum Thema LAN, WAN, Wireless ...

Heiß diskutierte Inhalte
Windows 10
Netzwerkkarte schaltet sich erst nach dem Logon ein (23)

Frage von DerWoWusste zum Thema Windows 10 ...

Windows Server
Seit IP Umstellung DC DNS Fehler (18)

Frage von Yaimael zum Thema Windows Server ...

Netzwerke
Mobile Einwahl IPSec VPN von iPhone iPad T-Mobile zur Pfsense (16)

Frage von Spitzbube zum Thema Netzwerke ...

Weiterbildung
gelöst Fest angestellter Admin oder Systemhaus Admin mit Kundenbetreuung? (15)

Frage von Voiper zum Thema Weiterbildung ...