Wie pflegen Sie relative symbolische Links während des Kopierens?

632
David Rogers

Ich habe eine Verzeichnisstruktur mit einer Reihe relativer symbolischer Links. Beispiel:

e: \ test e: \ test \ foo \ a -> ".. \ bar"
e: \ test \ bar \ b -> ".. \ foo"

Gibt es eine Möglichkeit, das gesamte Verzeichnis von übergeordnet auf einen beliebigen Speicherort (Sicherungslaufwerk ...) zu kopieren und die Relativität des Symlinks aufrechtzuerhalten? Im obigen Beispiel möchte ich, dass "a" weiterhin auf "eine Ebene höher und dann auf \ bar" zeigt.

Ich kann xcopy dazu bringen, den Inhalt jedes Symlinks tief zu kopieren, aber das verschwendet zu viel Platz.

1

1 Antwort auf die Frage

1
Ben N

Sie können dieses PowerShell-Skript verwenden, das unter Windows 10 getestet wurde:

param ([string]$Source, [string]$Dest) Add-Type -AssemblyName Microsoft.VisualBasic Function ReplaceString($text, $original, $replacement) { [Microsoft.VisualBasic.Strings]::Replace($text, $original, $replacement, 1, -1, 'Text') } $Source = (Resolve-Path $Source).Path $Dest = (Resolve-Path $Dest).Path Function CopySubdir($subdirPath) { gci $subdirPath -Force | % { If (-not $_.PSIsContainer) { Copy-Item $_.FullName -Destination (ReplaceString $_.FullName $Source $Dest) } ElseIf ($_.LinkType -ne 'SymbolicLink') { $newFolderPath = (ReplaceString $_.FullName $Source $Dest) mkdir $newFolderPath CopySubdir $_.FullName } } } CopySubdir $Source gci $Source -Recurse -Force | ? {$_.LinkType -eq 'SymbolicLink'} | % { $newPath = (ReplaceString $_.FullName $Source $Dest) Push-Location $_.Parent.FullName $newTarget = (ReplaceString (Resolve-Path $_.Target).Path $Source $Dest) Pop-Location New-Item -Path $newPath -ItemType SymbolicLink -Target $newTarget } 

Speichern Sie es als .ps1Datei und befolgen Sie die Anweisungen zum Aktivieren von Skripts im PowerShell-Tag-Wiki . Sie können das Skript anschließend an einer PowerShell-Eingabeaufforderung wie folgt ausführen:

.\symcopy.ps1 -Source 'C:\my\source' -Dest 'D:\dest' 

Es funktioniert auch mit relativen Pfaden, wie .\source.

So führen Sie eine normale Eingabeaufforderung aus:

powershell -command ".\symcopy.ps1 -Source 'C:\my\source' -Dest 'D:\dest'" 

Das Ziel sollte ein leerer Ordner sein, der den gleichen Inhalt wie der Quellordner erhält. Alle Dateien und Ordner werden wie üblich kopiert, aber alle Symbollinks werden überprüft und angepasst und später kopiert, sobald alle anderen Elemente vorhanden sind.

Einige Nachteile: Da Standardbenutzer unter normalen Bedingungen keine Symlinks erstellen können, muss dieses Skript als Administrator ausgeführt werden. ResourceExistsIn der letzten Phase können einige Fehler ausgegeben werden. diese sind nicht fatal und können ignoriert werden.

Dies funktionierte leider nicht beim Kopieren von symbolischen Links - stattdessen wurden die Zieldateien von Links kopiert. Vielen Dank für deine harte Arbeit. AveryFreeman vor 6 Jahren 0
@AveryFreeman Es ist schon eine Weile her, aber es sieht so aus, als würde dieses Skript keine symbolischen Dateiverknüpfungen behandeln, sondern nur symbolische Links von Verzeichnissen. Es kennt auch keine Verzeichnisverknüpfungen. Könnte einer davon das Problem sein? Ben N vor 6 Jahren 0
Ja, ich nahm an, dass es sich um alle symbolischen Links handelt - es wäre schön, wenn Sie auch einen Link hätten, der Symlinks für Dateien kopiert AveryFreeman vor 5 Jahren 0