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