Mit diesen erweiterten PowerShell-Befehlen können Sie Dateien kopieren

Das Kopieren von Dateien zwischen Ordnern, Laufwerken und Computern ist Zeitverschwendung, wenn Sie dies regelmäßig manuell tun. Ein bisschen PowerShell-Know-how automatisiert diesen langwierigen Prozess und bewältigt sogar die komplexesten Situationen.

Sobald Sie die mit dem Befehl “Element kopieren” verbundenen Parameter und ihre Funktionsweise verstanden haben, können Sie umfassende Skripts mit erweiterten PowerShell-Befehlen zum Kopieren von Dateien und Ordnern erstellen.

PowerShell verfügt über Anbieter – .NET-Programme, die die Daten in einem Datenspeicher zur Anzeige und Bearbeitung bereitstellen – und eine Reihe von gemeinsame Cmdlets das funktioniert anbieterübergreifend.

Dazu gehören die folgenden Cmdlets:

  • *-Artikel
  • * -ItemProperty
  • *-Inhalt
  • *-Pfad
  • *-Ort

Daher können Sie das Cmdlet Copy-Item verwenden, um Dateien, Registrierungsschlüssel und Variablen zu kopieren.

Wie benutzt man den Befehl “Artikel kopieren”?

Das Beispiel im folgenden Befehl verwendet die Variable $ a:

Copy-Item -Path variable:a -Destination variable:aa

In PowerShell ist es üblich, Transaktionen zu verwenden – einen oder mehrere Befehle, die als Einheit behandelt werden -, damit die Befehle entweder funktionieren oder zurückgesetzt werden.

Nur der Registrierungsanbieter unterstützt PowerShell-Transaktionen, sodass der UseTransaction-Parameter für Copy-Item nichts bewirkt. Der UseTransaction-Parameter ist Teil von Windows PowerShell v2 bis v5.1, jedoch nicht in der neueren plattformübergreifenden PowerShell-Version.
PowerShell verfügt über mehrere Aliase für die wichtigsten Cmdlets. Der folgende Befehl zeigt die drei Aliase copy, cp und cpi für das Cmdlet Copy-Item:

Get-Alias -Definition copy-item
CommandType     Name           Version    Source
-----------     ----            -------    ------
Alias           copy -> Copy-Item
Alias           cp -> Copy-Item
Alias           cpi -> Copy-Item

Diese Aliase sind nur in Windows PowerShell vorhanden, um einen Konflikt mit nativen Linux-Befehlen für Benutzer der Open Source-Version von PowerShell zu verhindern.

Wie können Sie PowerShell-Befehle zum Kopieren von Dateien verwenden?

Erstellen Sie eine Testdatei mit dem folgenden Befehl, um zu zeigen, wie die verschiedenen Copy-Item-Parameter funktionieren:

Get-Process | Out-File -FilePath c:testp1.txt

Verwenden Sie diesen Befehl, um eine Datei mit dem Zielparameter zu kopieren:

Copy-Item -Path C:testp1.txt -Destination C:test2

Das Problem mit diesem Befehl ist, dass es keinen Hinweis darauf gibt, ob der Vorgang erfolgreich ist oder fehlschlägt.
Wenn Sie interaktiv arbeiten, können Sie den Alias ​​und die Positionsparameter verwenden, um die Eingabe zu reduzieren.

Copy C:testp1.txt C:test2

Dies funktioniert in Skripten, erschwert jedoch das Verständnis und die Pflege des Codes.
Verwenden Sie den PassThru-Parameter, um Feedback zur Kopie zu erhalten. Diese Funktion liefert Ergebnisse für einen Befehl, der keine Ausgabe generiert. Es ist ein hilfreiches Tool, um den ordnungsgemäß ausgeführten Befehl zu bestätigen.

Copy-Item -Path C:testp1.txt -Destination C:test2 -PassThru
    Directory: C:test2
Mode          LastWriteTime    Length Name
----          -------------     ------ ----
-a----       13/08/2018  11:01    40670 p1.txt

Oder wir können den Verbose-Parameter verwenden:

PowerShell Verbose-Parameter
Der Parameter Verbose zeigt eine detaillierte Ausgabe an, wenn der PowerShell-Befehl ausgeführt wird

Der Parameter Verbose gibt Ihnen Informationen, während der Befehl ausgeführt wird, während PassThru das Ergebnis anzeigt.
Standardmäßig überschreibt PowerShell die Datei, wenn im Zielordner eine Datei mit demselben Namen vorhanden ist. Wenn die Datei im Zielverzeichnis schreibgeschützt ist, wird eine Fehlermeldung angezeigt.

Copy-Item -Path C:testp1.txt -Destination C:test2
Copy-Item : Access to the path 'C:test2p1.txt' is denied.
At line:1 char:1
+ Copy-Item -Path C:testp1.txt -Destination C:test2
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : PermissionDenied: (C:testp1.txt:FileInfo) [Copy-Item], UnauthorizedAccessException
+ FullyQualifiedErrorId : CopyFileInfoItemUnauthorizedAccessError,
Microsoft.PowerShell.Commands.CopyItemCommand

Sie müssen ein PowerShell-Jedi sein, um dies zu überwinden. Verwenden Sie den Force-Parameter:

Copy-Item -Path C:testp1.txt -Destination C:test2 -Force

PowerShell kann Dateien im Rahmen des Kopiervorgangs umbenennen. Mit diesem Code werden beispielsweise neun Kopien der Datei p1.txt mit den Namen p2.txt bis p10.txt erstellt.

2..10 | foreach {
 $newname = "p$_.txt"
 Copy-Item -Path C:testp1.txt -Destination C:test$newname
}

Wie können Sie PowerShell-Befehle verwenden, um mehrere Dateien oder Ordner zu kopieren?

Es gibt einige Techniken zum Kopieren mehrerer Dateien, wenn Sie PowerShell verwenden.

Copy-Item -Path C:test*.txt -Destination C:test2
Copy-Item -Path C:test*  -Filter *.txt -Destination C:test2
Copy-Item -Path C:test* -Include *.txt -Destination C:test2

Diese Befehle kopieren alle TXT-Dateien aus dem Testordner in den Ordner test2. Mit dem Parameter Include kann PowerShell jedoch selektiver ausgewählt werden. Mit dem folgenden Befehl werden beispielsweise nur Dateien mit einer 6 im Dateinamen kopiert.

Copy-Item -Path C:test* -Include *6*.txt -Destination C:test2 -PassThru
    Directory: C:test2
Mode        LastWriteTime       Length Name
----         -------------      ------ ----
-a----       13/08/2018 11:01    40670 p6.txt
-a----       13/08/2018 11:01    40670 x6.txt

Das Copy-Item verfügt über einen Exclude-Parameter, um bestimmte Dateien vom Kopiervorgang abzulehnen. Dieser PowerShell-Befehl kopiert nur Textdateien, die mit dem Buchstaben P beginnen, es sei denn, der Name enthält eine 7:

Copy-Item -Path C:test*  -Filter p*.txt  -Exclude *7*.txt -Destination C:test2
PowerShell-Kopieren
Sie können die PowerShell-Befehle so anpassen, dass Dateien aus einem Ordner kopiert werden, wenn sie mit einem bestimmten Buchstaben beginnen. Sie können sie jedoch ignorieren, wenn sie ein bestimmtes Zeichen enthalten

Beispiel: Erfahren Sie, wie Sie die Parameter Pfad, Filter, Einschließen oder Ausschließen verwenden
Kombinieren Sie die Parameter Pfad, Filter, Einschließen oder Ausschließen, um den Kopiervorgang noch weiter zu verfeinern. Wenn Sie Include und Exclude im selben Aufruf verwenden, ignoriert PowerShell Exclude. Sie können auch eine Reihe von Dateinamen angeben. Der Pfad wird vereinfacht, wenn Ihr Arbeitsordner der Quellordner für die Kopie ist.

Copy-Item -Path p1.txt,p3.txt,x5.txt -Destination C:test2

Der Parameter Path akzeptiert Pipeline-Eingaben.

Get-ChildItem -Path C:testp*.txt |
where {(($_.BaseName).Substring(1,1) % 2 ) -eq 0} |
Copy-Item -Destination C:test2

PowerShell überprüft die p * .txt-Dateien im Ordner c: test, um festzustellen, ob das zweite Zeichen durch zwei teilbar ist. In diesem Fall kopiert PowerShell die Datei in den Ordner C: test2.
Wenn Sie einen Ordner- oder Dateinamen erhalten, der Platzhalterzeichen enthält, verwenden Sie den Parameter LiteralPath anstelle des Parameters Path. LiteralPath behandelt alle Zeichen als Literale und ignoriert Platzhalter.
Beispiel: Rekursive Kopie
Verwenden Sie den Parameter Recurse, um einen Ordner und seinen gesamten Inhalt zu kopieren.

Copy-Item -Path c:test -Destination c:test2 -Recurse

Die rekursive Kopie durchläuft alle Unterordner unter dem Ordner c: test. PowerShell erstellt dann einen Ordner mit dem Namen “test” im Zielordner und kopiert den Inhalt von c: test in diesen Ordner.
Beim Kopieren zwischen Computern können Sie verwenden universelle Namenskonvention Pfade zum Umgehen des lokalen Computers.

Copy-Item -Path \server1fs1testp1.txt -Destination \server2arctest

Eine weitere Option ist die Verwendung von PowerShell-Befehlen zum Kopieren von Dateien über eine Remoting-Sitzung.

$cred = Get-Credential -Credential W16ND01Administrator
$s = New-PSSession -VMName W16ND01 -Credential $cred

In diesem Fall verwenden wir PowerShell Direct, um eine Verbindung zum Remotecomputer herzustellen. Sie müssen das Hyper-V-Modul laden, um die Remoting-Sitzung über den VMBus zu erstellen. Verwenden Sie als Nächstes PowerShell-Befehle, um Dateien auf den Remotecomputer zu kopieren.

Copy-Item -Path c:test -Destination c: -Recurse -ToSession $s

Sie können auch vom Remote-Computer kopieren.

Copy-Item -Path c:testp*.txt -Destination c:test3 -FromSession $s

Die Parameter ToSession und FromSession steuern die Richtung der Kopie und ob sich Quelle und Ziel auf dem lokalen oder einem entfernten Computer befinden. Sie können ToSession und FromSession nicht im selben Befehl verwenden.
Beispiel: Erweiterte Techniken zum Überprüfen auf Fehler und Fortsetzen einer Kopie
Dem Cmdlet “Copy-Item” fehlen Funktionen zur Fehlerprüfung oder zum Neustart. Für diese Funktionen müssen Sie den Code schreiben. Hier ist ein Ausgangspunkt:

function Copy-FileSafer {
 [CmdletBinding()]
 param (
   [string]$path,
   [string]$destinationfolder
 )
 if (-not (Test-Path -Path $path)) {
   throw "File not found: $path"
 }
 $sourcefile = Split-Path -Path $path -Leaf
 $destinationfile = Join-Path -Path $destinationfolder -ChildPath $sourcefile
 $b4hash = Get-FileHash -Path $path
 try {
    Copy-Item -Path $path -Destination $destinationfolder -ErrorAction Stop
 }
 catch {
   throw "File copy failed"
 }
 finally {
   $afhash = Get-FileHash -Path $destinationfile
   if ($afhash.Hash -ne $b4hash.Hash) {
      throw "File corrupted during copy"
   }
   else {
     Write-Information -MessageData "File copied successfully" -InformationAction Continue
   }
 }
}

Dieses Skript testet den Pfad der Quelldatei und berechnet den Datei-Hash. Der Dateikopiervorgang erfolgt innerhalb eines Try / Catch-Blocks, für den verwendet wird Ausnahmebehandlung.
Mit zusätzlicher Codierung kann das Skript mehrere Male rekursiv wiederholen. Nach jedem Kopierversuch kann das Skript Berechnen Sie den Hash der Datei und vergleichen Sie es mit dem Original. Wenn sie zusammenpassen, ist alles in Ordnung. Wenn nicht, wird ein Fehler gemeldet.

Similar Posts

Leave a Reply