Как сохранить относительные символические ссылки во время копирования?

577
David Rogers

У меня есть структура каталогов с кучей относительных символических ссылок. Пример:

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

Есть ли способ скопировать весь каталог из родительского в произвольное место (резервный диск ...) и сохранить относительность символической ссылки? В приведенном выше примере я хочу, чтобы «а» продолжал указывать на «вверх на один уровень, а затем вниз на \ bar».

Я могу получить xcopy для глубокого копирования содержимого каждой символической ссылки, но это тратит слишком много места.

1

1 ответ на вопрос

1
Ben N

Вы можете использовать этот скрипт PowerShell, протестированный в Windows 10:

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 } 

Сохраните его в виде .ps1файла и следуйте инструкциям «Включение сценариев» в вики-теге PowerShell . Затем вы можете запустить скрипт из командной строки PowerShell следующим образом:

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

Работает и с относительными путями, вроде .\source.

Для запуска из обычной командной строки:

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

Место назначения должно быть пустой папкой, которая будет получать то же содержимое, что и исходная папка. Все файлы и папки будут скопированы как обычно, но все символические ссылки будут проверены, скорректированы и скопированы позже, когда все остальное будет на месте.

Некоторые предостережения: поскольку обычные пользователи не могут создавать символические ссылки в обычных условиях, этот сценарий должен запускаться от имени администратора. Некоторые ResourceExistsошибки могут быть брошены на последнем этапе; они не смертельны и могут быть проигнорированы.

К сожалению, это не сработало для копирования символических ссылок - вместо этого началось копирование файлов назначения ссылки. Спасибо за вашу тяжелую работу, хотя. AveryFreeman 6 лет назад 0
@AveryFreeman Это было давно, но похоже, что этот скрипт не обрабатывает символические ссылки на файлы, а только каталоги. Кроме того, он не знает о соединениях каталогов. Может ли быть один из них проблемой? Ben N 6 лет назад 0
Да, я предполагал, что это было для всех символических ссылок - было бы хорошо иметь такую, которая копирует символические ссылки для файлов тоже AveryFreeman 6 лет назад 0