Kopyalama sırasında göreceli sembolik bağlar nasıl korunur?


1

Bir sürü bağıl sembolik bağ içeren bir dizin yapısına sahibim. Örnek:

e: \ testi e: \ test \ foo \ a - & gt; "..\bar"
e: \ test \ bar \ b - & gt; ".. \ foo"

Dizinin tamamını üst kısımdan rasgele bir yere (yedek sürücü ...) kopyalamanın ve sembolik bağlantının izafiyetini sürdürmenin bir yolu var mı? Yukarıdaki örnekte, "a" nın "bir seviye yukarı, sonra \ bar" işaretine devam etmesini istiyorum.

Her bir sembolik bağlantının içeriğini derinlemesine kopyalamak için xcopy alabilirim, ancak bu çok fazla alan boşa harcar.

Yanıtlar:


1

Windows 10'da test edilen bu PowerShell betiğini kullanabilirsiniz:

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
}

Olarak kaydet .ps1 dosyalayın ve içindeki Scriptleri Etkinleştirme talimatlarını izleyin. PowerShell etiketi wiki . Daha sonra komut dosyasını şunun gibi bir PowerShell isteminden çalıştırabilirsiniz:

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

Göreceli yollarla da çalışır, .\source.

Normal bir komut isteminden çalıştırmak için:

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

Hedef, kaynak klasörle aynı içerikleri alacak olan boş bir klasör olmalıdır. Tüm dosyalar ve klasörler her zamanki gibi kopyalanacak, ancak tüm sembolikler her şey yerine getirildikten sonra incelenecek ve ayarlanacak ve kopyalanacaktır.

Bazı uyarılar: Standart kullanıcılar normal şartlar altında sembolik bağlantılar oluşturamadığından, bu komut dosyasının yönetici olarak çalıştırılması gerekir. Bazı ResourceExists son aşamada hatalar atılabilir; bunlar ölümcül değildir ve göz ardı edilebilir.


Bu ne yazık ki sembolik linkleri kopyalamak için çalışmadı - bunun yerine linkin hedef dosyalarını kopyalamaya başladı. Yine de, sıkı çalışman için teşekkür ederim.
AveryFreeman

@AveryFreeman Bir süre oldu, ancak bu komut dosyası özel olarak dosya sembolik bağlantılarını değil, yalnızca dizin sembolik bağlantılarını işliyor gibi görünüyor. Ayrıca, dizin bağlantılarının farkında değildir. Bunlardan biri sorun olabilir mi?
Ben N

Evet, tüm sembolik linkler için olduğunu farz ettim - dosyalar için sembolik linkler kopyalayan birisinin olması güzel
AveryFreeman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.