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