Dienstag, Juli 30, 2013

Play Sound mit Powershell

Die folgenden Powershell Zeilen veranlassen Windows, eines der möglichen Logon Sounds abzuspielen.
Zuerst Powershell im Single Thread Apartment Modus starten: powershell -sta
Dann copy & paste
. . Getestet auf Windows7

#--------kopiere von hier-----------------
Cls;#Erstmal machen wir reinen Tisch
@"
https://www.ibjs.net 130730 - Zufällige Wiedergabe von Mediendateien in Powershell, FileSystem, Mediaplayer
Anregungen vom Guru http://powershell.com/cs/blogs/tobias/archive/2011/01/07/organizing-videos-and-music.aspx
sicherheitshalber die Powershell im STA Mode starten: powershell -sta
sonst sind Thread Fehler zu erwarten:
The calling thread cannot access this object because a different thread owns it
Der aufrufende Thread kann nicht auf dieses Objekt zugreifen,
da sich das Objekt im Besitz eines anderen Threads befindet.
"@
 If ($host.Runspace.ApartmentState -eq 'STA')
{
#Windows verwaltet FileSystemInfo Objekte, die man z.B. mit gci ermittelt
 $Suchwort="Logon"# Logon,Balloon, Default, Ding, Error, Notify, etc
 $files=(gci -path $env:windir/media -recurse "*$Suchwort*" -include *.wav,*.mp3)
 $file=$files|get-random -count 1
#Mit dem shell-object hat man Zugriff auf die zusätzlichen Dateieigenschaften für ein FileSystemObjekt
 $shell=New-Object -COMObject Shell.Application
#Man benötigt die shellfolder, welche Träger der Eigenschaften sind
 $shellfolder=$shell.namespace($file.DirectoryName)
#Die Eigenschaften beziehen sich auf die items des shellfolders, den shellfile
 $shellfile=$shellfolder.parsename($file.Name)
#msdn nennt 289 Eigenschaften: http://msdn.microsoft.com/en-us/library/windows/desktop/bb787870(v=vs.85).aspx
#die man mit getdetailsof anzeigen kann
 0..288|?{ $shellfolder.GetDetailsOf($shellfile, $_) }| %{'{0,-4}{1,-24}{2}' -f $_,$shellfolder.GetDetailsOf($null, $_),  $shellfolder.GetDetailsOf($shellfile, $_)}
#für den Medienplayer ist vielleicht die 27, die Liedlänge interessant
 $Länge=([timespan]$shellfolder.GetDetailsOf($shellfile,27)).totalseconds
 if ($Länge -gt 5) {$Länge=5} #kleine Bremse
#nun kann man den Medienplayer zum Abspielen bemühen
 Add-Type -AssemblyName presentationCore
 $mediaPlayer = New-Object system.windows.media.mediaplayer
 $mediaPlayer.open([uri]"$($file.fullname)")
 $mediaPlayer.Play()
#Warte bis Lied aus
 Start-Sleep -Seconds ([int]($Länge))
 $mediaPlayer.Stop()
#Ende der Vorstellung
} 
Else  {
"Starte die Powershell im Single Thread Appartment Modus mit: powershell -sta"
}
#Ende -------- kopiere bis hier !!!

Keine Kommentare: