Tags: Datei-Management, PowerShell, Remote Access
Zu den Neuerungen von PowerShell 5.0, das zum Lieferumfang von Windows 10 und Server 2016 gehört, zählen zwei zusätzliche Parameter für Copy-Item. Sie erlauben das Kopieren von Dateien über eine Remote-Session vom oder auf den entfernten Rechner. In Bezug auf die Session gelten indes einige Einschränkungen.
Windows bietet bekanntlich einige Mechanismen, um Dateien zwischen Rechnern zu übertragen. Die gängigsten sind Freigaben über SMB oder der Transfer mittels FTP. Wenn man auf der Kommandozeile arbeitet, dann ist es jedoch willkommen, dass man diese Aufgabe nun mit den Mitteln von PowerShell erledigen kann.
Session für Kopieraktion erstellen
Das Kopieren einer oder mehrerer Dateien von oder zu einem Remote-PC setzt voraus, dass man zu ihm erst eine Remote-Session aufbaut. Dies funktioniert mit Hilfe des Cmdlets New-PSSession:
$session = New-PSSession -ComputerName "Win10-L1"
Alternative Methoden für das Erzeugen einer Remote-Sitzung akzeptiert Copy-Item nicht. Dazu zählen New-CimSession und aus naheliegenden Gründen auch nicht Enter-PSSession, mit dem man eine interaktive Sitzung startet.
Session an Copy-Item übergeben
Im nächsten Schritt ruft man Copy-Item entweder mit dem Parameter ToSession oder FromSession auf, um eine Datei zum oder vom entfernten Rechner zu übertragen. Ihnen teilt man die zuvor eingerichtete Session mittels der dafür genutzte Variable mit:
Copy-Item -FromSession $session -Path "C:\Users\me\Downloads\*.iso" -Destination "C:\Users\me\Download"
In diesem Beispiel kopiert man mit FromSession alle .iso-Dateien vom Verzeichnis Downloads des Remote-PC auf den lokalen Rechner. Daher bezieht sich der Parameter Path, der die Quelle bezeichnet, auf das entfernte Dateisystem und Destination auf ein lokales Verzeichnis. Verwendet man ToSession, dann verhält es sich genau umgekehrt.
Interoperabel mit Windows 8.1
Möchte man auf diese Weise Verzeichnisse rekursiv kopieren oder vermeiden, dass im Ziel vorhandene Dateien überschrieben werden, dann muss man sich wie beim lokalen Kopieren auch hier mit den Eigenheiten von Copy-Item auseinandersetzen (siehe dazu: Copy-Item, Move-Item: Dateien kopieren und verschieben mit PowerShell).
Die Parameter ToSession und FromSession von Copy-Item sind zwar erst ab PowerShell 5.0 verfügbar, aber wenn man von dort eine Session zu PowerShell 4.0 unter Windows 8.1 aufbaut, dann klappt das Kopieren trotzdem. Der umgekehrte Weg geht natürlich nicht, weil die ältere Version von Copy-Item die neuen Parameter nicht kennt.
Dateien auf dem Remote-PC anzeigen
Eine Hürde für das Kopieren von Dateien zwischen Rechnern kann häufig einfach darin bestehen, dass man ihre genauen Namen oder Speicherorte nicht kennt. Das Hantieren mit Shares und UNC-Pfaden wäre hier widersinnig, dann könnte man gleich die Kopieraktion auf diesem Weg veranlassen.
Mit PowerShell-Mitteln lässt man sich die Dateien auf einem entfernten PC anzeigen, indem man dort mit Hilfe von Invoke-Command das Cmdlet Get-ChildItem ausführt:
Invoke-Command -Session $session -ScriptBlock {gci -Path "C:\users\me\Downloads\" | select FullName}
Typischerweise wird man Get-ChildItem vor Copy-Item aufrufen und dafür die gleiche Session nutzen, die man bereits für das anschließende Kopieren eingerichtet hat. Filtert man aus dem Ergebnis von gci (Alias für Get-ChildItem) die Eigenschaft FullName mit Select-Object,
dann erhält man die kompletten Dateinamen inklusive Pfad.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links
4 Kommentare
Ich wollte mich nur mal für die vielen tollen Kniffe die man hier regelmäßig findet bedanken. Tolle Seite!
Danke :-)
Sehr hilfreich. Danke für die Mühe und die sehr detaillierten Erklärungen!
Welchen Umweg könnte man fahren wenn der Remote Server eine PS v2 hat und der lokale eine PS v5? Würden Sie dann mit vorhandener Session ein Drive auf dem lokalen aufmachen zB
New-PSDrive -name X -provider FileSystem -Path C:\mytemp
Wie aber würden Sie dann die File-Kopie von dem Remote PC auf den lokalen vornehmen?
Copy-Item -Path 'external path' -Destination '\\localhost\X$' -FromSession $s
funktioniert hier nämlich nicht.