Você pode usar este script do PowerShell, testado no 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
}
Salve-o como um arquivo .ps1
e siga as instruções de Ativação de scripts em wiki de tags do PowerShell . Você pode então executar o script a partir de um prompt do PowerShell assim:
.\symcopy.ps1 -Source 'C:\my\source' -Dest 'D:\dest'
Ele também trabalha com caminhos relativos, como .\source
.
Para executar a partir de um prompt de comando normal:
powershell -command ".\symcopy.ps1 -Source 'C:\my\source' -Dest 'D:\dest'"
O destino deve ser uma pasta vazia que receberá o mesmo conteúdo da pasta de origem. Todos os arquivos e pastas serão copiados como de costume, mas todos os links simbólicos serão examinados e ajustados e copiados depois, quando tudo estiver em vigor.
Algumas ressalvas: Como os usuários padrão não podem criar links simbólicos em condições normais, esse script deve ser executado como administrador. Alguns erros ResourceExists
podem ser lançados no último estágio; estes não são fatais e podem ser ignorados.