Dateien effizient mit PowerShell Copy-Item kopieren: Ein umfassender Leitfaden

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.

PS> Test-Path -Path C:\PointB\1.txt
False
PS> Copy-Item -Path C:\PointA\1.txt -Destination C:\PointB\
PS> Test-Path -Path C:\PointB\1.txt
True 

Dieses Cmdlet kann auch leere Ordner kopieren. Ich werde Elemente im Ordner C:\EmptyFolder auflisten und dann kopieren.

PS> Get-ChildItem -Path C:\EmptyFolder\
PS> Test-Path -Path C:\PointB\EmptyFolder -PathType Container
False
PS> Copy-Item -Path C:\EmptyFolder\ -Destination C:\PointB\
PS> Test-Path -Path C:\PointB\EmptyFolder -PathType Container
True 

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.

PS> @(Get-ChildItem -Path C:\PointB).Count
0
PS> @(Get-ChildItem -Path C:\PointA).Count
10000
PS> @(Get-ChildItem -Path C:\PointB).Count
0
PS> Copy-Item -Path C:\PointA\* -Destination C:\PointB\
PS> @(Get-ChildItem -Path C:\PointB).Count
10000
PS> @(Get-ChildItem -Path C:\PointB).Count
0
PS> Copy-Item -Path 'C:\PointA\26?0.txt' -Destination C:\PointB\
PS> Get-ChildItem -Path C:\PointB\

Directory: C:\PointB
Mode                LastWriteTime         Length Name
-a----        8/11/2017   8:59 AM              5 2600.txt
-a----        8/11/2017   8:59 AM              5 2610.txt
-a----        8/11/2017   8:59 AM              5 2620.txt
-a----        8/11/2017   8:59 AM              5 2630.txt
-a----        8/11/2017   8:59 AM              5 2640.txt
-a----        8/11/2017   8:59 AM              5 2650.txt
-a----        8/11/2017   8:59 AM              5 2660.txt
-a----        8/11/2017   8:59 AM              5 2670.txt
-a----        8/11/2017   8:59 AM              5 2680.txt
-a----        8/11/2017   8:59 AM              5 2690.txt

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“.

PS> Copy-Item -Path C:\PointB\*,C:\PointC\*,C:\PointD\* -Destination C:\PointE
PS> Get-ChildItem -Path C:\PointE

Directory: C:\PointE
Mode                LastWriteTime         Length Name
-a----       11/11/2017  12:15 PM              2 PointBFile.txt
-a----       11/11/2017  12:15 PM              2 PointCFile.txt
-a----       11/11/2017  12:16 PM              4 PointDFile.txt

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!

PS> (Get-ChildItem -Path C:\PointB\ -Recurse).Count
5
PS> Get-ChildItem -Path C:\PointB\ | Copy-Item -Destination C:\PointC -Recurse
PS> (Get-ChildItem -Path C:\PointC\ -Recurse).Count
5

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:

$remoteFilePath = '\WEBSRV1\c$\File.txt'
Copy-Item -Path C:\File.txt -Destination $remoteFilePath
Write-Host "I've just copied the file to $remoteFilePath"

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.

$copiedFile = Copy-Item -Path C:\File.txt -Destination '\WEBSRV1\c$'

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.

PS> $session = New-PSSession -ComputerName WEBSRV1
PS> Invoke-Command -Session $session -ScriptBlock { Test-Path -Path C:\File.txt }
False
PS> Copy-Item -Path C:\File.txt -ToSession $session -Destination 'C:\'
PS> Invoke-Command -Session $session -ScriptBlock { Test-Path -Path C:\File.txt }
True

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

Copy-item

Source:
https://adamtheautomator.com/copy-item/