1

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

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

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

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

1 ответ1

1

Вы можете использовать этот скрипт 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 могут быть выброшены на последнем этапе; они не смертельны и могут быть проигнорированы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .