Große Dateien kopieren mit BITS und Powershell

    Für das Kopieren von (großen) Dateien hat die PowerShell (zwangsläufig) einiges zu bieten. Neben dem etwas schlichten Copy-Item-Cmdlet (das z.B. keine Anmeldung an eine Freigabe ermöglicht) stehen die Windows-Befehle XCopy und der inoffizielle Nachfolger RoboCopy (für „Robust Copy“) zur Auswahl. Beide werden exakt auf dieselbe Art und Weise aufgerufen, wie innerhalb der "regulären" Befehlszeile.

    Eine weitere Alternative ist der BITS-Dienst (Background Intelligent Transfer Service), der im Folgenden kurz vorgestellt wird. BITS ist ein Dienst, der bei Windows schon lange dabei ist, und der unter anderem das Arbeitspferd des Windows-Updates ist. Wer weiß, wie Windows seine Updates abwickelt, kennt auch bereits zwei Grundeigenschaften von BITS: Zuverlässig und unauffällig (hartnäckig wäre eine weitere Eigenschaft). Der BITS-Dienst bietet für Anwendungen eine COM-Schnittstelle, die von einer Reihe von PowerShell-Cmdlets gekapselt wird, die Teil des BitsTransfer-Moduls sind, das mit der PowerShell 2.0 installiert wird und damit immer zur Verfügung steht.

    Modul für BITS laden

    Ein Import-Module Bitstransfer lädt das Modul, ein Get-Command –Module BitsTransfer listet alle Cmdlets aus dem Modul auf. Im Mittelpunkt steht das Start-BitsTransfer-Cmdlet, das, wie der Name es vermuten lässt, einen Transfer startet.

    Im einfachsten Fall werden wie bei XCopy&Co lediglich die Quell- und die Zieldatei angegeben:

    Import-Module BitsTransfer

    $QuellVerzeichnis = "C:\ISOS\*.iso"
    $ZielVerzeichnis = "Z:\ISOBackup"

    Start-BitsTransfer -Source $QuellVerzeichnis `
     -Description "ISO-Transfer" `
     -Destination $ZielVerzeichnis `
     -DisplayName "ISO-Transfer" 

    Soll der Transfer als Job im Hintergrund ausgeführt werden, erledigt das der Parameter Asynchron.

    Ein solcher Transfer muss über das Complete-BitsTransfer-Cmdlet abgeschlossen werden:

    Get-BitsTransfer | Where-Object { $_.DisplayName -eq "ISO-Transfer" } | Complete-BitsTransfer

    Die BITS-Cmdlets eignen sich vor allem für das Kopieren großer Images. Ein weiteres Merkmal ist der Umstand, dass ein Kopierauftrag fortgesetzt wird nachdem der Rechner herunter- und danach neu gestartet wurde (wer das überprüfen möchte, sollte es einfach einmal ausprobieren).

    1 Kommentar

    Bild von Peter Monadjemi
    30. April 2012 - 15:26

    PSDiableModuleAutoLoading kommt erst mit PowerShell 3. Die Idee ist, dass die Metadaten aller verfügbaren Module per Default geladen werden (aber nur die Metadaten, nicht die Module), so dass sich die Namen von noch nicht geladenen Cmdlets trotzdem abfragen lassen. Über PSDiableModuleAutoLoading kann dieses Verhalten deaktiviert werden.