Tạo liên kết cứng và mềm bằng PowerShell


226

PowerShell 1.0 có thể tạo các liên kết cứng và mềm tương tự như loại Unix không?

Nếu điều này không được tích hợp, ai đó có thể chỉ cho tôi một trang web có tập lệnh ps1 bắt chước điều này không?

Đây là một chức năng cần thiết của bất kỳ vỏ tốt, IMHO. :)


6
Người dùng Windows 10 thấy stackoverflow.com/a 432905638/195555 . Windows 10 nó được tích hợp sẵn. Sao chép / Dán: New-Item -Type và nhấn tab để chuyển qua các tùy chọn. Hardlink, SymbolicLinkJunctionxuất hiện cho tôi. Hoạt động Win 10, Server 2016+ hoặc HĐH cũ hơn với Powershell 5.0+ được cài đặt qua Windows Management Framework 5.0+.
yzorg

2
Tôi không thể tìm thấy tài liệu MSDN / TechNet đàng hoàng cho New-Item -Type HardLinkcả New-Item -Type SymbolicLink. Tài liệu New-Item liên kết đến help about_Providers, nó gợi ý bạn đọc trợ giúp cho từng nhà cung cấp (không liên kết). Nhưng nếu bạn google nó, có rất nhiều tiếng vang trong cộng đồng PowerShell xung quanh New-Item -Type HardLink. Có vẻ như nhóm kỹ thuật PowerShell đã đưa ra các điểm mở rộng của nhà cung cấp , làm cho nhóm tài liệu trở nên khó khăn.
yzorg

Câu trả lời:


253

Bạn có thể gọi mklinkđược cung cấp bởi cmd, từ PowerShell để tạo các liên kết tượng trưng:

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

Bạn phải vượt qua /dđể mklinknếu mục tiêu là một thư mục.

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

Đối với các liên kết cứng, tôi đề xuất một cái gì đó như Sysiternals Junction .


29
Nếu bạn có một hồ sơ quyền hạn, bạn cũng có thể thực hiện một chức năng nhanh chóngfunction mklink { cmd /c mklink $args }
Joe Young

14
và nếu bạn muốn tạo một liên kết thư mục, lệnh sẽ giống như {cmd / c mklink / D "toDir" fromDir}
DavidDraughn

9
việc thêm tham số / H vào mklink sẽ tạo ra một liên kết cứng mà không cần chương trình của bên thứ ba như Sysi INTERNals Junction.
Fopedush

3
Tôi nghĩ rằng jocassid có câu trả lời tốt hơn. IMHO, Chúng ta nên cố gắng dạy cách sử dụng PowerShell, không sử dụng khai thác và hack thông qua cmd.exe.
Cameron Oakenleaf


266

Windows 10 (và Powershell 5.0 nói chung) cho phép bạn tạo các liên kết tượng trưng thông qua lệnh ghép ngắn New-Item .

Sử dụng:

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

Hoặc trong hồ sơ của bạn:

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

Bật Chế độ nhà phát triển để không yêu cầu quyền quản trị khi tạo liên kết với New-Item:

nhập mô tả hình ảnh ở đây


2
Liên kết này hiện bị hỏng do tài liệu sắp xếp lại MS. Tôi đã tìm thấy một liên kết làm việc hiện tại tại technet.microsoft.com/en-us/l Library / hh849795.aspx
Aaron Thomas

3
Mục mới -Path C: \ LinkDir -ItemType SymbolicLink -Value F: \ RealDir
Daniel Fisher lennybacon

7
kể từ Windows v1703, mklink cho phép tạo liên kết tượng trưng mà không cần nâng cao tài khoản, nếu chế độ Nhà phát triển được bật trong Cài đặt, Mục mới không có. Hy vọng trong bản cập nhật tiếp theo.
papo

Hấp dẫn. Vì vậy, điều này khá khác biệt với một .lnkphím tắt Explorer . Trong explorer, một phím tắt và liên kết tượng trưng cùng tên hiển thị cạnh nhau như thể không có gì là không ổn. Hành vi của họ là khác nhau tinh tế; theo liên kết tượng trưng cho thấy đường dẫn tuyệt đối trong thanh Explorer. Theo lối tắt xử lý nó như thể thư mục gốc symlink là cha mẹ thực sự.
BaseZen

1
Với câu trả lời được chấp nhận , tôi đã có thể sử dụng các đường dẫn tương đối, đó không phải là trường hợp với New-Itemlệnh.
Dave F

41

Thêm mô-đun "pscx"

Không, nó không được tích hợp vào PowerShell. Và mklinktiện ích không thể tự gọi được trên Windows Vista / Windows 7 vì nó được tích hợp trực tiếp cmd.exedưới dạng "lệnh nội bộ" .

Bạn có thể sử dụng Tiện ích mở rộng cộng đồng PowerShell (miễn phí). Có một số lệnh ghép ngắn cho các điểm khác nhau của các loại:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • và những người khác.

1
Tốt thử. Mặc dù nếu bạn muốn chạy máy chủ XP hoặc W2K3 ở x32 hoặc x64, New-Symlink không hoạt động. Trong XP, nó sẽ lịch sự cho bạn biết rằng bạn nên chạy Vista cho lệnh này. Trong máy chủ W2K3, nó thoát ra.
Mike T

Đó là vì XP không hỗ trợ liên kết tượng trưng. Đó là một tính năng mới đối với Vista. Tôi tin rằng máy chủ W2K3 cũng không hỗ trợ liên kết tượng trưng. Bạn phải bước lên máy chủ W2K8 để được hỗ trợ symlink. Tôi sẽ xem xét lý do tại sao symlink mới đánh bom trên W2k3, nó sẽ báo lỗi với một thông báo tương tự như XP.
Keith Hill

Tôi đã thử giao lộ mới và điều đó sẽ làm việc cho tôi. Quá tệ, chức năng liên kết không làm giảm các mối nối trong XP và W2K3
Mike T

khi tiếp tục sử dụng ngã ba mới ... Tôi có một điểm nối đến điểm phân tích mới. Tuy nhiên, lỗi ls (hoặc get-childitem) cho biết rằng .. "Tên tệp, tên thư mục hoặc cú pháp nhãn âm lượng không chính xác" Nếu tôi thử và nhập thư mục con từ đó.
Mike T

2
Người dùng Windows 10 thấy câu trả lời stackoverflow.com/a 432905638/195755 . Windows 10 nó được tích hợp sẵn. Sao chép / Dán: New-Item -Type và nhấn tab để chuyển qua các tùy chọn. Hardlink, SymbolicLinkJunctionxuất hiện cho tôi. Hoạt động Win 10, Server 2016+ hoặc HĐH cũ hơn với Powershell 5.0 được cài đặt qua Windows Management Framework 5.0+.
yzorg

23

Trong Windows 7, lệnh là

fsutil hardlink create new-file existing-file

PowerShell tìm thấy nó mà không có đường dẫn đầy đủ (c: \ Windows \ system32) hoặc tiện ích mở rộng (.exe).


1
fsutil hardlinkyêu cầu new-fileexisting-filephải ở trên cùng một ổ đĩa. Nếu điều đó quan trọng với bạn, mklink /cthay vào đó hãy sử dụng cmd .
lột xác vào

9
@mopsled Các liên kết cứng, theo định nghĩa, phải ở cùng một âm lượng với mục tiêu, đây không phải là giới hạn cụ thể đối với fsutil(hoặc Windows cho vấn đề đó)
Dev

Có một tương đương cho các liên kết và liên kết "mềm"?
jshall

Cũng hoạt động trên hệ thống Windows10.
FooF

15

Liên kết mới:

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

Xóa-Liên kết:

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

    invoke-expression "$command $link"
}

Sử dụng:

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

2
Người dùng Windows 10 thấy stackoverflow.com/a 432905638/195555 . Windows 10 nó được tích hợp sẵn. Sao chép / Dán: New-Item -Type và nhấn tab để chuyển qua các tùy chọn. Hardlink, SymbolicLinkJunctionxuất hiện cho tôi. Hoạt động Win 10, Server 2016+ hoặc HĐH cũ hơn với Powershell 5.0 được cài đặt qua Windows Management Framework 5.0+.
yzorg

Hoặc nếu tên tệp chứa chúng.
Chris Charabaruk

10

Hãy thử jeft.exe

các Junction tiện ích dòng lệnh từ SysInternals làm cho việc tạo và xóa nút giao thông dễ dàng.

đọc thêm

  • Thuật ngữ MS: soft! = Tượng trưng
    Microsoft sử dụng "liên kết mềm" làm tên gọi khác của "đường giao nhau" .
    Tuy nhiên: một "liên kết tượng trưng" là một cái gì đó hoàn toàn khác.
    Xem MSDN: Liên kết cứng và mối nối trong Windows.
    (Điều này mâu thuẫn trực tiếp với cách sử dụng chung của các thuật ngữ đó trong đó "liên kết mềm""liên kết tượng trưng" ( "liên kết tượng trưng" ) DO có nghĩa tương tự .)

Việc sử dụng tiện ích này một cách chính xác cho phép tôi kết nối một thư mục khác và duyệt qua thư mục con của nó thành công. Tất cả trong XP và W2K3. Chỉ cần thêm exe vào một thư mục trong PATH của bạn và gọi nó như bình thường.
Mike T

Tôi không nghĩ rằng bạn có thể sử dụng jeft.exe để tạo các liên kết tượng trưng.
Jason R. Coombs

3
Nó tốt hơn để sử dụng mklinkđược cung cấp với Windows. Nếu bạn có một phiên bản Windows mà nó được vận chuyển cùng.
Đã xóa

5

Bạn có thể sử dụng tiện ích này:

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

1
Nó sẽ yêu cầu đặc quyền nâng cao, mặc dù. Tạo liên kết cứng thường không.
Joey

3

Tôi đã viết một mô-đun PowerShell có trình bao bọc riêng cho MKLINK. https://gist.github.com/2891103

Bao gồm các chức năng cho:

  • Liên kết mới
  • New-HardLink
  • Giao lộ mới

Nắm bắt đầu ra MKLINK và ném các lỗi PowerShell thích hợp khi cần thiết.


3

Tôi đã kết hợp hai câu trả lời (@bviktor và @jocassid). Nó đã được thử nghiệm trên Windows 10 và 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"""
    }
}

1

Trên thực tế, lệnh Sysiternals junction chỉ hoạt động với các thư mục (đừng hỏi tôi tại sao), vì vậy nó không thể liên kết các tệp cứng. Tôi sẽ sử cmd /c mklinkdụng các liên kết mềm (tôi không thể hiểu tại sao nó không được PowerShell hỗ trợ trực tiếp) hoặc fsutilcho các liên kết cứng.

Nếu bạn cần nó để hoạt động trên Windows XP, tôi không biết gì khác ngoài Sysiternals junction, vì vậy bạn có thể bị giới hạn trong các thư mục.


-1

Tôi thấy đây là cách đơn giản mà không cần sự giúp đỡ từ bên ngoài. Vâng, nó sử dụng một lệnh DOS cổ xưa nhưng nó hoạt động, nó dễ dàng và rõ ràng.

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

Điều này sử dụng lệnh dir DOS để tìm tất cả các mục có thuộc tính liên kết tượng trưng, ​​các bộ lọc trên tên liên kết cụ thể theo sau dấu ngoặc "[]" và cho mỗi - có lẽ chỉ trích ra một chuỗi đích.


5
Đây có phải là một câu trả lời cho một câu hỏi khác nhau?
Allanrbo 7/07/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.