Membuat tautan keras dan lunak menggunakan PowerShell

226

Dapatkah PowerShell 1.0 membuat tautan keras dan lunak analog dengan variasi Unix?

Jika ini bukan bawaan, dapatkah seseorang mengarahkan saya ke situs yang memiliki skrip ps1 yang meniru ini?

Ini adalah fungsi yang diperlukan dari shell yang bagus, IMHO. :)

Mike T
sumber
6
Pengguna Windows 10 melihat stackoverflow.com/a/34905638/195755 . Windows 10 itu sudah built-in. Salin / Tempel: New-Item -Type dan tekan tab untuk menelusuri opsi. Hardlink,, SymbolicLinkdan Junctionmuncul untukku. Bekerja dengan Win 10, Server 2016+, atau OS yang lebih lama dengan Powershell 5.0+ diinstal melalui Windows Management Framework 5.0+.
yzorg
2
Saya tidak dapat menemukan dokumentasi MSDN / TechNet yang layak untuk New-Item -Type HardLinkmaupun New-Item -Type SymbolicLink. Tautan dokumen Item Baru help about_Providers, ini menyarankan Anda membaca bantuan untuk setiap penyedia (yang tidak ditautkan). Tetapi jika Anda google ada banyak buzz di komunitas PowerShell sekitar New-Item -Type HardLink. Sepertinya tim teknik PowerShell telah datang dengan titik ekstensi penyedia yang membingungkan tim dokumentasi.
yzorg

Jawaban:

253

Anda dapat memanggil yang mklinkdisediakan oleh cmd, dari PowerShell untuk membuat tautan simbolik:

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

Anda harus lulus /duntuk mklinkjika target adalah sebuah direktori.

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

Untuk tautan keras, saya sarankan sesuatu seperti Sysinternals Junction .

Jason R. Coombs
sumber
29
Jika Anda memiliki profil PowerShell, Anda juga dapat membuat fungsi cepatfunction mklink { cmd /c mklink $args }
Joe Young
14
dan jika Anda ingin membuat tautan direktori, perintahnya akan berupa {cmd / c mklink / D "toDir" fromDir}
DavidDraughn
9
menambahkan parameter / H ke mklink akan membuat tautan keras tanpa perlu program pihak ketiga seperti Sysinternals Junction.
Fopedush
3
Saya pikir jocassid memiliki jawaban yang lebih baik. IMHO, Kita harus mencoba mengajarkan cara MENGGUNAKAN PowerShell, tidak menggunakan exploit dan hacks melalui cmd.exe.
Cameron Oakenleaf
2
@SergeVoloshenko Tentu saja . Benar, menggunakan New-Item tidak mendeteksi jika target adalah direktori , tetapi New-Item akan gagal jika target tidak ada sedangkan mklink akan membuat tautan simbolik bagaimanapun .
Jason R. Coombs
266

Windows 10 (dan Powershell 5.0 secara umum) memungkinkan Anda untuk membuat tautan simbolik melalui cmdlet Item Baru .

Pemakaian:

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

Atau di profil Anda:

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

Aktifkan Mode Pengembang untuk tidak memerlukan hak admin saat membuat tautan dengan New-Item:

masukkan deskripsi gambar di sini

jocassid
sumber
2
Tautan ini sekarang rusak karena MS menata ulang dokumentasi. Saya menemukan tautan aktif saat ini di technet.microsoft.com/en-us/library/hh849795.aspx
Aaron Thomas
3
Item-Baru -Path C: \ LinkDir -ItemType SymbolicLink -Nilai F: \ RealDir
Daniel Fisher lennybacon
7
sejak Windows v1703, mklink memungkinkan pembuatan symlink tanpa peningkatan akun, jika mode Pengembang diaktifkan di Pengaturan, Item Baru tidak. Semoga di pembaruan selanjutnya.
papo
Menarik. Jadi ini sangat berbeda dari .lnkpintasan Explorer . Di penjelajah, pintasan dan symlink dari nama yang sama ditampilkan berdampingan seolah-olah tidak ada yang salah. Perilaku mereka agak berbeda; mengikuti symlink menunjukkan jalur absolut di bilah Explorer. Mengikuti pintasan memperlakukannya seolah-olah dir orangtua symlink adalah orangtua yang benar.
BaseZen
1
Dengan jawaban yang diterima , saya dapat menggunakan jalur relatif, yang tidak terjadi dengan New-Itemcommandlet.
Dave F
41

Tambahkan modul "pscx"

Tidak, itu tidak dibangun ke dalam PowerShell. Dan mklinkutilitas tidak dapat dipanggil sendiri di Windows Vista / Windows 7 karena dibangun langsung menjadi cmd.exe"perintah internal" .

Anda dapat menggunakan Ekstensi Komunitas PowerShell (gratis). Ada beberapa cmdlet untuk titik reparasi dari berbagai jenis:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • dan lain-lain.
Keith Hill
sumber
1
Usaha yang bagus. Meskipun jika Anda ingin menjalankan server XP atau W2K3 di x32 atau x64, New-Symlink tidak berfungsi. Di XP dengan sopan akan memberi tahu Anda bahwa Anda harus menjalankan Vista untuk perintah ini. Di server W2K3, itu rusak.
Mike T
Itu karena XP tidak mendukung symlink. Itu fitur baru untuk Vista. Saya percaya bahwa server W2K3 juga tidak mendukung symlink. Anda harus melangkah ke server W2K8 untuk mendapatkan dukungan symlink. Saya akan mencari tahu mengapa symlink baru adalah pemboman di W2k3, itu harus kesalahan dengan pesan yang mirip dengan XP.
Keith Hill
Saya mencoba persimpangan baru dan itu akan berhasil untuk saya. Sayang sekali fungsionalitas tautan tidak menurun ke persimpangan di XP dan W2K3
Mike T
pada penggunaan lebih lanjut dari persimpangan baru ... saya mendapatkan persimpangan ke titik parse baru. Namun kesalahan ls (atau get-childitem) menyatakan bahwa .. "Sintaks nama file, nama direktori, atau label volume salah" Jika saya mencoba dan memasukkan subdirektori dari sana.
Mike T
2
Pengguna Windows 10 melihat jawaban stackoverflow.com/a/34905638/195755 . Windows 10 itu sudah built-in. Salin / Tempel: New-Item -Type dan tekan tab untuk menelusuri opsi. Hardlink,, SymbolicLinkdan Junctionmuncul untukku. Bekerja Win 10, Server 2016+, atau OS yang lebih lama dengan Powershell 5.0 diinstal melalui Windows Management Framework 5.0+.
yzorg
23

Di Windows 7, perintahnya adalah

fsutil hardlink create new-file existing-file

PowerShell menemukannya tanpa path lengkap (c: \ Windows \ system32) atau ekstensi (.exe).

quigi
sumber
1
fsutil hardlinkmembutuhkan new-filedan existing-fileberada di drive yang sama. Jika itu penting bagi Anda, gunakan cmd mklink /csebagai gantinya.
Dicampur
9
@mopsled Hardlinks, menurut definisi, harus pada volume yang sama dengan target, ini bukan batasan khusus untuk fsutil(atau Windows dalam hal ini)
Dev
Adakah yang setara dengan symlink dan persimpangan "lunak"?
jshall
Bekerja juga pada sistem Windows10.
FooF
15

Symlink Baru:

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"
}

Hapus-Symlink:

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

    invoke-expression "$command $link"
}

Pemakaian:

New-Symlink "c:\foo\bar" "c:\foo\baz"
Remove-Symlink "c:\foo\bar"
bviktor
sumber
2
Pengguna Windows 10 melihat stackoverflow.com/a/34905638/195755 . Windows 10 itu sudah built-in. Salin / Tempel: New-Item -Type dan tekan tab untuk menelusuri opsi. Hardlink,, SymbolicLinkdan Junctionmuncul untukku. Bekerja Win 10, Server 2016+, atau OS yang lebih lama dengan Powershell 5.0 diinstal melalui Windows Management Framework 5.0+.
yzorg
Atau jika nama file mengandungnya.
Chris Charabaruk
10

Coba junction.exe

The Junction utilitas baris perintah dari SysInternals membuat membuat dan menghapus persimpangan mudah.

Bacaan lebih lanjut

  • MS Terminology: soft! = Simbol
    Microsoft menggunakan "soft link" sebagai nama lain untuk "junction" .
    Namun: "tautan simbolik" adalah sesuatu yang sepenuhnya berbeda.
    Lihat MSDN: Hard Link dan Sambungan di Windows.
    (Ini bertentangan langsung dengan penggunaan umum istilah-istilah di mana "tautan lunak" dan "tautan simbolik" ( "symlink" ) DO memiliki arti yang sama .)
Notandy
sumber
Penggunaan utilitas ini dengan benar memungkinkan saya untuk persimpangan direktori lain dan melintasi subdirektori dengan sukses. Semua dalam XP dan W2K3. Cukup tambahkan exe ke direktori di PATH Anda dan menyebutnya seperti biasa.
Mike T
Saya tidak berpikir Anda dapat menggunakan junction.exe untuk membuat tautan simbolik.
Jason R. Coombs
3
Lebih baik menggunakan mklinkyang dikirimkan bersama Windows. Jika Anda memiliki versi Windows yang dikirimkan.
Dihapus
5

Anda dapat menggunakan utilitas ini:

c:\Windows\system32\fsutil.exe create hardlink
Cheeso
sumber
1
Ini akan membutuhkan hak yang lebih tinggi. Membuat hardlink biasanya tidak.
Joey
3

Saya menulis modul PowerShell yang memiliki pembungkus asli untuk MKLINK. https://gist.github.com/2891103

Termasuk fungsi untuk:

  • Baru-Symlink
  • New-HardLink
  • Persimpangan Baru

Menangkap output MKLINK dan melemparkan kesalahan PowerShell yang tepat bila perlu.

joshuapoehl
sumber
3

Saya menggabungkan dua jawaban (@bviktor dan @jocassid). Itu diuji pada Windows 10 dan Windows Server 2012.

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"""
    }
}
mhenry1384
sumber
1

Sebenarnya, perintah Sysinternals junction hanya bekerja dengan direktori (jangan tanya kenapa), jadi tidak bisa menghubungkan file. Saya akan menggunakan cmd /c mklinktautan lunak (Saya tidak tahu mengapa itu tidak didukung langsung oleh PowerShell), atau fsutiluntuk hardlink.

Jika Anda membutuhkannya untuk bekerja pada Windows XP, saya tidak tahu apa pun selain Sysinternals junction, jadi Anda mungkin terbatas pada direktori.

segera
sumber
-1

Saya menemukan ini dengan cara sederhana tanpa bantuan eksternal. Ya, ia menggunakan perintah DOS kuno tetapi berfungsi, mudah, dan jelas.

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

Ini menggunakan perintah dir DOS untuk menemukan semua entri dengan atribut tautan simbolik, memfilter pada nama tautan spesifik diikuti dengan tanda kurung "[]", dan untuk masing-masing - mungkin satu - mengekstrak hanya string target.

Steven
sumber
5
Apakah ini jawaban untuk pertanyaan yang berbeda?
Allanrbo