“Wie kriegt man einen Browser ohne Browser?” - Windows 7 ohne IE8

In Europa will Microsoft ja Windows 7 ohne Internet Explorer ausliefern, und immer wieder kommt die Frage “Ja wie kann ich denn einen Browser ‘runterladen ohne Browser?”

Also erstens denke ich, dass man den IE8 als optionales Update über Windows Update bekommen wird, zweitens denke ich, dass jeder OEM einen Browser nachrüsten wird, bevor er Windows 7 ausliefert und drittens gibt’s ja noch Powershell v2 ;-)

Einfach Powershell öffnen und diesen handlichen Einzeiler eintippen:

Import-Module bitstransfer ; Start-BitsTransfer –source "http://hyperion.zih.tu-dresden.de/moz/firefox/releases/3.0.11/win32/de/Firefox%20Setup%203.0.11.exe" -destination "C:\Users\Public\Downloads\"

oder

Import-Module bitstransfer ; Start-BitsTransfer -source "http://download.microsoft.com/download/3/D/C/3DC5DC1B-2B60-487A-BAE2-732662BC0886/IE8-WindowsVista-x86-DEU.exe" -destination "C:\Users\Public\Downloads\"

;-) 

Okay das war jetzt nicht 100% ernst gemeint, aber wieso nicht, gegebenenfalls noch die Download URL ausbessern (Sprache, Architektur etc.)

Apropos – Das Powershell v2 Modul Filetransfer, dass ich schon in meinem Beitrag “Podcatcher mit Powershell v2 & BITS” beschrieben hatte, wurde umbenannt in Bitstransfer und verwendet eine deutlich andere Syntax als in früheren Betaversionen von Powershell v2.

Podcatcher mit Powershell v2 & BITS

Vor kurzem habe ich einen Podcatcher mit Powershell und BITS (“Background Intelligent Transfer Service”) geschrieben, für den man aber zusätzlich noch bitsadmin.exe und bget.cmd benötigt.
Da bitsadmin.exe eher mühsam und bget.cmd zwar nett aber etwas buggy ist, bin ich gleich auf die schon damals angeführte Möglichkeit umgestiegen, Powershell v2 (CTP 3) zu verwenden – damit braucht man nämlich keine zusätzlichen Tools mehr.

Das ganze funktioniert bisher recht robust – ich möchte nur noch eine (visuelle) Statusanzeige dazu programmieren.

param ([switch] $schedule)
#Set-PSDebug -Trace 1
Import-Module FileTransfer -Verbose

$today = get-date
$yesterday = $today.AddDays(-1)
$today = Get-Date -date $today -uformat "%Y%m%d"
$yesterday = Get-Date -date $yesterday -uformat "%Y%m%d"
$today = $today.tostring()
$yesterday = $yesterday.tostring()

if ($schedule) {
$taskname = $myinvocation.mycommand.definition -replace '\W','_'
schtasks /create /ru PIVO9\Christian /rl HÖCHSTE /sc MINUTE /MO 5 /tn "$taskname" /tr "%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell -c $($myinvocation.mycommand.definition)"
return;
}

pushd (split-path -parent $myinvocation.mycommand.definition)

$feed=[xml](New-Object System.Net.WebClient).DownloadString("http://***.*****.net/mythfeed/feed.php")
foreach($i in $feed.rss.channel.item) {
    $url = New-Object System.Uri($i.enclosure.url)
    $absURL = $url.AbsoluteUri   
    $filename = "C:\Users\Public\Videos\ElskeTV\" + $url.Segments[-1]
    If ((Test-Path $filename) -eq $FALSE) 
    {
echo ----------------------------------------------------------------------------------------------------
echo $url.Segments[-1]

$joblist = Get-FileTransfer
$jobexist = $false

foreach ($i in $joblist) {

foreach ($j in $i.filelist) {
if ($j.IsTransferComplete) { Complete-FileTransfer $i }
if ($j.RemoteName -eq $absURL) {
echo "Job wurde gefunden..."
if ($j.BytesTotal -gt 0) { "{0:P1}" -f  ($j.BytesTransferred / $j.BytesTotal) }
$i.JobState
$i.CreationTime
$jobexist = $true
if ($j.RemoteName -match $today) {$i | Set-FileTransfer -Priority "FOREGROUND" }
if ($j.RemoteName -match $yesterday) {$i | Set-FileTransfer -Priority "FOREGROUND" }
}
}}

if ($jobexist -eq $false) {
New-FileTransfer -ServerFileName $absURL -ClientFileNamePrefix C:\users\Public\videos\ElskeTV\ -Displayname $url.Segments[-1] -Asynchronous
Echo "Neuer Download-Job wurde hinzugefügt!"
}

    }
}

echo ----------------------------------------------------------------------------------------------------

popd

#Fortschritt in Prozent der einzelnen Downloads
#$joblist = Get-FileTransfer ; foreach ($i in $joblist) { foreach ($j in $i.filelist) { if ($j.BytesTotal -gt 0) { "{0:P1}" -f  ($j.BytesTransferred / $j.BytesTotal) }}}

#Summe aller übertragenen Bytes aller Downloadjobs
#$joblist = Get-FileTransfer ; $total = 0 ; foreach ($i in $joblist) { foreach ($j in $i.filelist) { if ($j.BytesTotal -gt 0) {$total = $total + $j.BytesTransferred}}} ; $total ; get-date

#Downloadjobs auflisten, die in den letzten 10 Minuten erstellt wurden
#get-FileTransfer | Where {$(Get-Date).AddMinutes(-10) -lt $_.CreationTime}

#Dateien auflisten mit einem bestimmten Datum im Dateinamen
#$joblist = Get-FileTransfer ; foreach ($i in $joblist) { foreach ($j in $i.filelist) { if ($j.RemoteName -match "20090418") {$i | fl * } }}

#Priority hochsetzen für Downloads mit einem bestimmten Datum im Dateinamen
#$joblist = Get-FileTransfer ; foreach ($i in $joblist) { foreach ($j in $i.filelist) { if ($j.RemoteName -match "20090418") {$i | Set-FileTransfer -Priority "FOREGROUND" } }}

 

 

Podcatcher mittels Powershell und BITS

Das BITS (“Background Intelligent Transfer Service”) ist ein Windows Dienst der sich um den Download von (größeren) Dateien ressourcen und netzwerkschonend im Hintergrund kümmert. Da er als Service läuft und auch Resumes unterstützt, kann auch ein Reboot einem mit BITS initiierten Download nichts anhaben. Ursprünglich nur für Windows Updates gedacht, kann man BITS mit dem Tool bitsadmin.exe auch für andere/eigene Downloads nutzen.
Bitsadmin.exe bekommt man bei älteren Windows Versionen über die Windows Support Tools, ab Windows Vista ist es bereits enthalten.
Da bitsadmin.exe nicht besonders userfreundlich ist, verwende ich bget.cmd zur Steuerung von BITS download jobs.
Ich habe einige Video Podcasts (mit US Fernsehsendungen), die ich regelmäßig herunterladen möchte, und mit allen verfügbaren Podcatchern für Windows (inkl. iTunes) bin ich mehr als unzufrieden. Daher lag die Idee nahe, einen eigenen Podcatcher mit Powershell zu schreiben.

Nichts leichter als das!

Man nehme:

  • Powershell 1.0
  • bitsadmin.exe
  • bget.cmd (hier)

podcatcher.ps1

$feed=[xml](New-Object System.Net.WebClient).DownloadString("http://podcast.msnbc.com/audio/podcast/MSNBC-NN-NETCAST-M4V.xml")
foreach($i in $feed.rss.channel.item) {
    $url = New-Object System.Uri($i.enclosure.url)
   
$absURL = $url.AbsoluteUri   
    $filename = "D:\Videos\" + $url.Segments[-1]
    If ((Test-Path $filename) -eq $FALSE) 
    {
    bget """$absURL""" """$filename""" –b
    }
}

Zuerst hole ich mir das XML File des RSS Feed herunter. Dann loope ich durch alle items, und lasse mir die enclosure URLs zurückgeben. Als Objekt vom Typ System.Uri kann ich hier unter anderem auf die Parameter AbsoluteUri (ganze URL, bereits urlencoded, falls das im Feed nicht der Fall war) und segments[-1], welcher mir nur den Dateinamen zurückgibt, zugreifen.
Schließlich stelle ich noch sicher, dass das File im Zielpfad nicht existiert, und dann übergebe ich URL, Filename und den Batch Parameter “-b” an bget.
BITS erstellt das File im Zielordner erst, wenn es fertig heruntergeladen ist. Das ist auch praktisch im Vergleich zu anderen Podcatchern, so landen keine unfertigen Videos im Video-Ordner.
BITS und bget kümmern sich auch von selbst darum, dass ein File dass bereits heruntergeladen wird, nicht nochmal heruntergeladen wird (anhand der URL).
So muß ich podcatcher.ps1 nur mehr in der Aufgabenplanung regelmäßig ausführen, und ich habe einen perfekten podcatcher der absolut robust ist und mir nicht mehr ein Verzeichnis mit halbfertig heruntergeladenen Video Files hinterläßt, so wie seine Vorgänger.

Übrigens: Schön, wieder mal sagen zu können “In Windows 7 wird alles besser” – Genauer gesagt in PowerShell 2.0, das in Windows 7 und Windows Server 2008 R2 bereits enthalten sein wird. Da brauchen wir dann nämlich weder bitsadmin.exe noch bget.cmd sondern können BITS komplett mittels Powershell Cmdlets (z.B. 'New-FileTransfer') steuern. Mehr dazu hier -  die Syntax ist aber noch nicht ganz final. Wenn Powershell 2.0 final ist, werde ich dieses Skript umschreiben.

Facebook

Letzte Tweets

Twitter Mai 26, 23:39
Gelbe Engel! Danke!

Twitter Mai 18, 21:34
Finland was terrible. #Eurovision

Twitter Mai 17, 12:49
just blogged Ist das Surface Pro teuer? – Ein Fact-Check: Gestern wurde angekündigt, dass das Surface Pro in D... http://t.co/PhW7qzhkUq

Folge mir auf Twitter!

Über den Autor

MCTS

Christian Haberl Christian Haberl ist seit mehr als 10 Jahren als EDV Berater, Vortragender und Trainer tätig. Er kann sich nicht für ein Spezialgebiet entscheiden, drum heißt dieser Blog auch "Kraut & Rüben Blog" - Unter seine Interessen fallen Web-Entwicklung auf ASP.NET Basis, Information Worker & Productivity Technologien (Windows, Office), Server (Windows Server, Small Business, Virtualisierung, Exchange), Scripting, Spam Filtering/Security und Digital Home. Christian Haberl ist auch einer der führenden Produktspezialisten für Windows Media Center und Windows Home Server und ist Direktor des ClubDigitalHome.
Im Jahr 2008 hat Christian Haberl über 200 Vorträge und Schulungen durchgeführt.
Im Frühjahr 2009 wurde Christian Haberl von Microsoft Österreich zum "Influencer" ernannt, weiters wurde er Microsoft Certified Technology Specialist / Microsoft Certified Connected Home Integrator sowie Microsoft Certified Consumer Sales Specialist.

Month List

Netzwerk Management

Bandwidth

RecentComments

Comment RSS