Kopieren von Dateien. Es ist nicht sexy, aber es muss erledigt werden. In der grafischen Benutzeroberfläche kopieren wir mit der Zwischenablage, aber in PowerShell haben wir eine Cmdlet namens Copy-Item.
Befehle zum Kopieren von Dateien gibt es schon lange in allen Shell-Sprachen. In der PowerShell-Welt ist der beliebteste Weg, eine Kopie einer Datei oder eines Ordners in Ihrem PowerShell-Skript von Punkt A nach Punkt B zu bekommen, die Verwendung des PowerShell-Cmdlets Copy-Item
. Dieses Cmdlet ermöglicht es uns, eine Datei und einen Ordner zu kopieren, während wir die Möglichkeit haben, Dateien in einem Ordner zu durchlaufen, Platzhalterzeichen zu verwenden, um die zu kopierenden Dateien auszuwählen und sogar PowerShell Remoting für eine Dateikopie zu verwenden!
Dieses Cmdlet ist Teil der PowerShell-Provider-Cmdlets. Es ist ein generisches Cmdlet, das an seinem Substantiv Item erkannt wird. Die meisten dieser Provider-Cmdlets können über verschiedene Provider hinweg verwendet werden, aber in meinen fast 10 Jahren der Verwendung von PowerShell habe ich Copy-Item
nur mit dem Dateisystem-Provider gesehen.
Durch die Verwendung dieses Cmdlets ermöglicht PowerShell einem Entwickler das Kopieren von Dateien und Ordnern auf verschiedene Arten.
Grundlegende Verwendung
Am einfachsten kopiert das Copy-Item
-Cmdlet eine einzelne Datei von Punkt A nach Punkt B, wobei der Path
-Parameter den Quelldateipfad und der Destination
-Parameter den Zielpfad des Ordners angibt.
Dieses Cmdlet kann auch leere Ordner kopieren. Ich werde Elemente im Ordner C:\EmptyFolder auflisten und dann kopieren.
Möglicherweise befindet sich eine schreibgeschützte Datei im Ordner. Standardmäßig wird sie von Copy-Item
nicht überschrieben. Um dies zu erzwingen, fügen Sie einfach den Parameter Force
hinzu.
Selektives Kopieren mit Copy-Item
Zusätzlich zum Kopieren einer einzelnen Datei oder eines Ordners können wir auch den gesamten Inhalt eines Ordners kopieren. Der Path
-Parameter von Copy-Item akzeptiert Platzhalterzeichen wie den Asterisk, um ein oder mehrere Zeichen zu entsprechen, oder das Fragezeichen, um nur ein einzelnes Zeichen zu entsprechen.
Mehrere Ordner zusammenführen
Eine weitere coole Funktion von Copy-Item
ist die Möglichkeit, mehrere Ordner gleichzeitig zu kopieren. Indem Sie mehrere Pfade an den Path
-Parameter übergeben, wird Copy-Item
jeden einzelnen betrachten, entweder den Ordner oder die Datei(en) abhängig vom Pfad kopieren und alles in das einzelne Ziel „zusammenführen“.
Dateien rekursiv kopieren
Die Chancen stehen gut, dass Sie nicht das Glück haben und alle Dateien in einem einzigen Ordner ohne Unterordner haben. In der Regel stoßen wir auf Situationen, in denen wir viele Unterordner im übergeordneten Ordner haben, in denen sich ebenfalls Dateien befinden, die wir kopieren möchten. Durch Verwendung des Parameters Recurse
bei Copy-Item
sieht es gerne in jedem Unterordner nach und kopiert alle Dateien und Ordner rekursiv.
Beachten Sie hier, dass ich Dateien und Ordner direkt von Get-ChildItem
an Copy-Item
weiterleite. Copy-Item
unterstützt die Pipeline!
Vorteile der Verwendung des PassThru-Parameters
Viele Cmdlets in PowerShell haben einen PassThru-Parameter. Cmdlets, die normalerweise nichts zurückgeben, können mithilfe des PassThru-Parameters die von ihnen manipulierten Objekte zurückgeben. Dieses Cmdlet ist da keine Ausnahme. Als ich anfing zu skripten, habe ich diesen Parameter nie verwendet, weil ich dachte, dass ich ihn nicht brauche.
Zum Beispiel, wenn ich eine Datei an einen entfernten Speicherort kopieren und später in meinem Skript auf diese Datei verweisen möchte, würde ich etwas Ähnliches tun:
Diese Methode funktioniert, aber es gibt eine bessere Möglichkeit. Anstatt eine Variable für den entfernten Pfad zu definieren, warum nicht einfach das Objekt erfassen, das von dem Copy-Item
-Cmdlet zurückgegeben wird, wenn der PassThru
-Parameter verwendet wird? Die zurückgegebenen Objekte werden immer den Zielpfad der Datei enthalten.
Kopieren von Dateien mit einer PowerShell-Remotesitzung
Eine coole Funktion, die mit PowerShell v5 eingeführt wurde, ist die Möglichkeit dieses Cmdlets, nicht das Standard-SMB-Protokoll zum Übertragen einer Datei zu verwenden, sondern WinRM und eine PowerShell-Remotesitzung. Durch Verwendung des Session
-Parameters verwendet Copy-Item
eine bestehende PowerShell-Sitzung und überträgt die Dateien auf diese Weise. Dies ist eine großartige Möglichkeit, Firewalls zu umgehen, und wenn die Kommunikation der Sitzung verschlüsselt ist, bietet es auch eine zusätzliche Sicherheitsebene.
Wir könnten die Datei File.txt über SMB kopiert und gehofft haben, dass der C$-Admin-Share verfügbar war und den Zielpfad \\WEBSRV1\c$
verwendet. Da wir stattdessen den ToSession
-Parameter verwendet haben, wird der Zielpfad immer der Pfad auf dem Computer sein, unter dem die Remotesitzung ausgeführt wird.
Zusammenfassung
Das Copy-Item
-Cmdlet ist eines der grundlegenden PowerShell-Cmdlets, das Sie immer wieder verwenden werden. In PowerShell können Sie Dateien und Ordner auf verschiedene Arten kopieren, dank seiner einfachen, aber leistungsstarken Funktionen, insbesondere der Verwendung von Platzhaltern, dem Zusammenführen mehrerer Ordner mit Dateien und der Verwendung bestehender PowerShell-Remoting-Sitzungen!
Weitere Informationen
