PowerShell kullanarak sert ve yumuşak bağlantılar oluşturma


226

PowerShell 1.0, Unix çeşidine benzer sert ve yumuşak bağlantılar oluşturabilir mi?

Bu yerleşik değilse, birisi beni taklit eden bir ps1 betiği olan bir siteye yönlendirebilir mi?

Bu, iyi bir kabuk olan IMHO'nun gerekli bir işlevidir. :)


6
Windows 10 kullanıcıları stackoverflow.com/a/34905638/195755 adresine bakın . Windows 10 bu olduğu yerleşik. Kopyala / Yapıştır: New-Item -Type ve seçenekler arasında gezinmek için sekmeye basın. Hardlink,, SymbolicLinkve Junctionbenim için görünür. Windows Management Framework 5.0+ ile yüklenmiş Powershell 5.0+ ile Win 10, Server 2016+ veya daha eski bir işletim sistemi çalışır.
yzorg

2
Ben iyi MSDN / TechNet belgelerine bulamıyor New-Item -Type HardLinkne de New-Item -Type SymbolicLink. Yeni Öğe dokümanlar bağlantı veriyor help about_Providers, her sağlayıcı için (bağlı olmayan) yardımı okumanızı önerir. Ancak Google'ı kullanırsanız, PowerShell topluluğunda çok sayıda vızıltı var New-Item -Type HardLink. PowerShell mühendislik ekibi, dokümanlar ekibini zorlayan sağlayıcı uzantı noktaları bulmuş gibi görünüyor .
yzorg

Yanıtlar:


253

Sembolik bağlantılar oluşturmak için PowerShell'den mklinksağlananları arayabilirsiniz cmd:

cmd /c mklink c:\path\to\symlink c:\target\file

Sen geçmelidir /diçin mklinkhedef bir dizin ise.

cmd /c mklink /d c:\path\to\symlink c:\target\directory

Sabit bağlantılar için Sysinternals Junction gibi bir şey öneriyorum .


29
Bir powershell profiliniz varsa, hızlı bir işlev de yapabilirsinizfunction mklink { cmd /c mklink $args }
Joe Young

14
ve bir dizin bağlantısı yapmak istiyorsanız, komut {cmd / c mklink / D "toDir" fromDir}
DavidDraughn

9
/ H parametresini mklink'e eklemek Sysinternals Junction gibi bir üçüncü taraf programına ihtiyaç duymadan sabit bir bağlantı oluşturur.
Fopedush

3
Bence jassassid daha iyi cevaba sahip. IMHO, cmd.exe aracılığıyla açıkları ve hack'leri değil PowerShell'i nasıl kullanacağımızı öğretmeye çalışmalıyız.
Cameron Oakenleaf


266

Windows 10 (ve genel olarak Powershell 5.0) Yeni Öğe cmdlet'i aracılığıyla sembolik bağlantılar oluşturmanıza olanak tanır .

Kullanımı:

New-Item -Path C:\LinkDir -ItemType SymbolicLink -Value F:\RealDir

Veya profilinizde:

function make-link ($target, $link) {
    New-Item -Path $link -ItemType SymbolicLink -Value $target
}

Aşağıdakilerle bağlantı kurarken yönetici ayrıcalıkları gerektirmemek için Geliştirici Modunu açın New-Item:

resim açıklamasını buraya girin


2
Bu bağlantı artık MS yeniden düzenleme belgeleri nedeniyle bozuldu. Technet.microsoft.com/en-us/library/hh849795.aspx
Aaron Thomas

3
Yeni Öğe -Yol C: \ LinkDir -ItemType SembolikBağlantı -Değeri F: \ RealDir
Daniel Fisher lennybacon

7
Windows v1703'ten bu yana, mklink, hesap yükselmesi olmadan sembolik bağlantılar oluşturulmasına izin verir, Ayarlar'da Geliştirici modu etkinleştirilirse, Yeni Öğe etkinleştirmez. Umarım bir sonraki güncellemede.
papo

Büyüleyici. Yani bu bir Explorer .lnkkısayolundan oldukça farklı . Explorer'da, aynı addaki bir kısayol ve sembolik bağlantı, hiçbir şey yanlışmış gibi yan yana görüntülenir. Davranışları oldukça farklıdır; Symlink'i takip etmek Gezgin çubuğunda mutlak yolu gösterir. Kısayolu izlemek, sembolik üst dizin gerçek üst öğe gibi davranır.
BaseZen

1
İle kabul edilen cevap , beraber böyle değildi göreli yolları kullanmak başardı New-Itemcommandlet.
Dave F

41

"Pscx" modülü ekle

Hayır, PowerShell'de yerleşik değildir. Ve doğrudan bir "dahili komut" olarak yerleşikmklink olduğundan , yardımcı program Windows Vista / Windows 7 üzerinde kendi başına çağrılamaz .cmd.exe

PowerShell Topluluk Uzantılarını kullanabilirsiniz (ücretsiz). Çeşitli tiplerde yeniden ayrıştırma noktaları için birkaç cmdlet vardır:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • ve diğerleri.

1
İyi denemeydi. XP veya W2K3 sunucusunu x32 veya x64'te çalıştırmak istiyorsanız, New-Symlink dozu çalışmıyor. XP'de bu komut için Vista'yı çalıştırmanız gerektiğini kibarca söyleyecektir. W2K3 sunucusunda kopuyor.
Mike T

Çünkü XP sembolik bağlantıları desteklemez. Bu Vista için yeni bir özellik. W2K3 sunucusunun da sembolik bağlantıları desteklemediğine inanıyorum. Symlink desteği almak için W2K8 sunucusuna geçmelisiniz. Yeni symlink'in W2k3'te neden bombaladığını inceleyeceğim, XP'ye benzer bir mesajla hata yapmalı.
Keith Hill

Yeni kavşağı denedim ve bu benim için işe yarayacak. Bağlantı işlevselliği XP ve W2K3'teki kavşaklara düşmüyor
Mike T

yeni kavşağın daha fazla kullanılması üzerine ... Yeni ayrıştırma noktasına bir kavşak alıyorum. Ancak ls (veya get-childitem) hataları belirten .. "Dosya adı, dizin adı veya birim etiketi sözdizimi yanlış" Ben denemek ve oradan bir alt dizin girin.
Mike T

2
Windows 10 kullanıcıları answer stackflowflow.com/a/34905638/195755 yanıtına bakın . Windows 10 bu olduğu yerleşik. Kopyala / Yapıştır: New-Item -Type ve seçenekler arasında gezinmek için sekmeye basın. Hardlink,, SymbolicLinkve Junctionbenim için görünür. Windows Management Framework 5.0+ ile yüklenmiş Powershell 5.0 yüklü Win 10, Server 2016+ veya daha eski bir işletim sistemi çalışır.
yzorg

23

Windows 7'de, komut

fsutil hardlink create new-file existing-file

PowerShell, tam yol (c: \ Windows \ system32) veya uzantı (.exe) olmadan bulur.


1
fsutil hardlinkgerektirir new-fileve existing-fileaynı sürücüde olmasını gerektirir . Bu sizin için önemliyse, mklink /cbunun yerine cmd'leri kullanın.
15'te

9
mopsled Hardlinks, tanım gereği, hedefle aynı hacimde olmalıdır, bu belirli bir sınırlama değildir fsutil(veya bu konu için Windows)
Dev

"yumuşak" sembolik bağlantılar ve kavşaklar için eşdeğer bir şey var mı?
jshall

Windows10 sisteminde de çalıştı.
FooF

15

Yeni-Simgesel:

Function New-SymLink ($link, $target)
{
    if (test-path -pathtype container $target)
    {
        $command = "cmd /c mklink /d"
    }
    else
    {
        $command = "cmd /c mklink"
    }

    invoke-expression "$command $link $target"
}

Kaldır-Simgesel:

Function Remove-SymLink ($link)
{
    if (test-path -pathtype container $link)
    {
        $command = "cmd /c rmdir"
    }
    else
    {
        $command = "cmd /c del"
    }

    invoke-expression "$command $link"
}

Kullanımı:

New-Symlink "c:\foo\bar" "c:\foo\baz"
Remove-Symlink "c:\foo\bar"

2
Windows 10 kullanıcıları stackoverflow.com/a/34905638/195755 adresine bakın . Windows 10 bu olduğu yerleşik. Kopyala / Yapıştır: New-Item -Type ve seçenekler arasında gezinmek için sekmeye basın. Hardlink,, SymbolicLinkve Junctionbenim için görünür. Windows Management Framework 5.0+ ile yüklenmiş Powershell 5.0 yüklü Win 10, Server 2016+ veya daha eski bir işletim sistemi çalışır.
yzorg

Veya dosya adı bunları içeriyorsa.
Chris Charabaruk

10

Junction.exe dosyasını deneyin

Bağlantı SysInternals'ndan komut satırı yardımcı oluşturma ve kolay kavşaklar silme yapar.

daha fazla okuma

  • MS Terminoloji:! Yumuşak = sembolik
    Microsoft kullandığı "yumuşak bağlantısını" için başka bir ad olarak "birleşme" .
    Ancak: "sembolik bir bağlantı" tamamen başka bir şeydir.
    Bkz. MSDN: Windows'daki Sabit Bağlantılar ve Bağlantılar .
    (Bu, bu terimlerin genel kullanıma doğrudan çelişir "yumuşak bağ" ve "sembolik bağlantı" ( "sembolik link" ) aynı anlama geliyor DO .)

Bu yardımcı programın doğru kullanımı, başka bir dizini birleştirmem ve alt dizinlerini başarıyla geçmemi sağlıyor. Hepsi XP ve W2K3'te. Exe'yi PATH'inizdeki bir dizine ekleyin ve normal gibi çağırın.
Mike T

Sembolik bağlantılar oluşturmak için junction.exe kullanabileceğinizi sanmıyorum.
Jason R. Coombs

3
mklinkWindows ile birlikte gelen kullanımı daha iyidir . Birlikte verilen bir Windows sürümünüz varsa .
Silinmiş

5

Bu yardımcı programı kullanabilirsiniz:

c:\Windows\system32\fsutil.exe create hardlink

1
Yine de yükseltilmiş ayrıcalıklar gerektirecek. Sabit bağlantı oluşturmak genellikle olmaz.
Joey

3

MKLINK için yerel sarmalayıcıları olan bir PowerShell modülü yazdım. https://gist.github.com/2891103

Aşağıdakiler için işlevler içerir:

  • Yeni-Simgesel
  • Yeni-Hardlink
  • Yeni-Kavşak

MKLINK çıkışını yakalar ve gerektiğinde uygun PowerShell hatalarını atar.


3

İki cevabı birleştirdim (@bviktor ve @jocassid). Windows 10 ve Windows Server 2012'de test edildi.

function New-SymLink ($link, $target)
{
    if ($PSVersionTable.PSVersion.Major -ge 5)
    {
        New-Item -Path $link -ItemType SymbolicLink -Value $target
    }
    else
    {
        $command = "cmd /c mklink /d"
        invoke-expression "$command ""$link"" ""$target"""
    }
}

1

Aslında, Sysinternals junction komutu yalnızca dizinlerle çalışır (nedenini sorma), bu nedenle dosyaları bağlayamaz. Birlikte gider cmd /c mklink, ya da (o değil PowerShell tarafından doğrudan desteklenen neden anlayamazsınız) yumuşak bağlantılar için fsutilsabit bağlantılarını için.

Windows XP'de çalışması için Sysinternals dışında bir şey bilmiyorum junction, bu nedenle dizinlerle sınırlı olabilirsiniz.


-1

Bunu harici yardım almadan basit bir yol buldum. Evet, arkaik bir DOS komutu kullanıyor ancak çalışıyor, kolay ve açık.

$target = cmd /c dir /a:l | ? { $_ -match "mySymLink \[.*\]$" } | % `
{
    $_.Split([char[]] @( '[', ']' ), [StringSplitOptions]::RemoveEmptyEntries)[1]
}

Bu, sembolik bağlantı özniteliğine sahip tüm girdileri bulmak için DOS dir komutunu, belirli bağlantı adındaki filtreleri ve ardından hedef "[]" parantezlerini kullanır ve her biri için muhtemelen hedef dizeyi ayıklar.


5
Bu farklı bir sorunun cevabı mı?
Allanrbo
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.