สร้างฮาร์ดลิงก์และซอฟต์ลิงค์ด้วย PowerShell


226

PowerShell 1.0 สามารถสร้างลิงก์ที่อ่อนนุ่มและเชื่อมโยงกับ Unix หลากหลายได้หรือไม่?

หากสิ่งนี้ไม่ได้ถูกสร้างขึ้นมามีใครบางคนสามารถพาฉันไปที่ไซต์ที่มีสคริปต์ ps1 ที่เลียนแบบสิ่งนี้ได้หรือไม่?

นี่เป็นฟังก์ชั่นที่จำเป็นสำหรับเชลล์ที่ดี IMHO :)


6
ของ Windows ผู้ใช้ 10 คนดูstackoverflow.com/a/34905638/195755 Windows 10 เป็นอุปกรณ์ในตัว คัดลอก / วาง: New-Item -Type และกดแท็บเพื่อวนตัวเลือกต่างๆ Hardlink, SymbolicLinkและJunctionปรากฏสำหรับฉัน ใช้งานได้กับ Win 10, Server 2016+ หรือระบบปฏิบัติการรุ่นเก่าที่ติดตั้ง Powershell 5.0+ ผ่าน Windows Management Framework 5.0+
yzorg

2
ฉันไม่สามารถหาเอกสาร MSDN / TechNet ที่ดีสำหรับมิได้New-Item -Type HardLink New-Item -Type SymbolicLinkลิงก์เอกสารรายการใหม่help about_Providersแนะนำให้คุณอ่านวิธีใช้สำหรับผู้ให้บริการแต่ละราย (ซึ่งไม่ได้เชื่อมโยง) แต่ถ้าคุณ google New-Item -Type HardLinkมันมีมากมายของฉวัดเฉวียนในชุมชนรอบ ดูเหมือนว่าทีมวิศวกรรม PowerShell เกิดขึ้นกับคะแนนส่วนขยายของผู้ให้บริการที่ทำให้ทีมงานเอกสารเกิดปัญหาขึ้น
yzorg

คำตอบ:


253

คุณสามารถเรียกmklinkให้โดยcmdจาก PowerShell ที่จะทำให้การเชื่อมโยงสัญลักษณ์:

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

คุณต้องผ่าน/dไปmklinkถ้าเป้าหมายคือไดเรกทอรี

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

สำหรับการเชื่อมโยงอย่างหนักผมขอแนะนำสิ่งที่ต้องการSysinternals สนธิ


29
หากคุณมีโปรไฟล์ PowerShell คุณสามารถสร้างฟังก์ชั่นได้อย่างรวดเร็วfunction mklink { cmd /c mklink $args }
Young Young

14
และถ้าคุณต้องการสร้างลิงค์ไดเรกทอรีคำสั่งจะเป็นอะไรเช่น {cmd / c mklink / D "toDir" fromDir}
DavidDraughn

9
การเพิ่มพารามิเตอร์ / H ไปยัง mklink จะสร้างฮาร์ดลิงก์โดยไม่จำเป็นต้องใช้โปรแกรมของบุคคลที่สามเช่น Sysinternals Junction
Fopedush

3
ฉันคิดว่าโจคาซิดมีคำตอบที่ดีกว่า IMHO เราควรพยายามสอนวิธีใช้ PowerShell ไม่ใช้การโกงและแฮ็กผ่าน cmd.exe
คาเมรอน Oakenleaf

2
@SergeVoloshenko มันไม่แน่ใจว่า ทรูมันนี่ใช้New-Item ไม่ตรวจสอบหากเป้าหมายเป็นไดเรกทอรีแต่New-Item จะล้มเหลวถ้าเป้าหมายไม่ได้อยู่ในขณะmklink จะสร้างการเชื่อมโยงสัญลักษณ์โดยไม่คำนึงถึง
Jason R. Coombs

266

Windows 10 (และ Powershell 5.0 โดยทั่วไป) ช่วยให้คุณสร้างลิงก์สัญลักษณ์ผ่าน cmdlet รายการใหม่

การใช้งาน:

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

หรือในโปรไฟล์ของคุณ:

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

เปิดโหมดนักพัฒนาซอฟต์แวร์เพื่อไม่ต้องการสิทธิ์ผู้ดูแลระบบเมื่อสร้างลิงก์ด้วยNew-Item:

ป้อนคำอธิบายรูปภาพที่นี่


2
ลิงก์นี้ใช้งานไม่ได้เนื่องจากเอกสารที่จัดเรียงใหม่ของ MS ฉันพบลิงค์ที่ใช้งานได้ในปัจจุบันที่technet.microsoft.com/en-us/library/hh849795.aspx
แอรอนโธมัส

3
รายการใหม่ - แพทช์ C: \ LinkDir -ItemType SymbolicLink -Value F: \ RealDir
Daniel Fisher lennybacon

7
ตั้งแต่ Windows v1703, mklink อนุญาตให้สร้าง symlink โดยไม่ต้องยกระดับบัญชีหากเปิดใช้งานโหมดนักพัฒนาซอฟต์แวร์ในการตั้งค่ารายการใหม่ไม่ได้ หวังว่าในการปรับปรุงต่อไป
papo

มโนหร ดังนั้นนี่จึงค่อนข้างแตกต่างจาก.lnkทางลัดของExplorer ใน explorer ทางลัดและ symlink ที่แสดงชื่อเดียวกันแบบเคียงข้างกันราวกับว่าไม่มีอะไรผิดปกติ พฤติกรรมของพวกเขาแตกต่างกันเล็กน้อย หลังจาก symlink จะแสดงพา ธ สัมบูรณ์ในแถบ Explorer การทำตามทางลัดถือว่ามันเหมือนกับว่า symlink parent dir เป็น parent จริง
BaseZen

1
ด้วยคำตอบที่ยอมรับได้ฉันสามารถใช้เส้นทางสัมพัทธ์ซึ่งไม่ใช่กรณีที่มีNew-Itemcommandlet
Dave F

41

เพิ่มโมดูล "pscx"

ไม่มันไม่ได้สร้างไว้ใน PowerShell และmklinkยูทิลิตี้จะไม่สามารถเรียกตัวของมันเองบน Windows Vista / Windows 7 เพราะมันถูกสร้างขึ้นโดยตรงในcmd.exeฐานะที่เป็น "คำสั่งภายใน"

คุณสามารถใช้ส่วนขยายชุมชน PowerShell (ฟรี) มี cmdlets หลายจุดสำหรับการแยกวิเคราะห์ซ้ำของประเภทต่างๆ:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • และคนอื่น ๆ.

1
ดีลอง แม้ว่าคุณต้องการเรียกใช้เซิร์ฟเวอร์ XP หรือ W2K3 ใน x32 หรือ x64 แต่ New-Symlink จะไม่สามารถใช้งานได้ ใน XP มันจะบอกคุณอย่างสุภาพว่าคุณควรใช้งาน Vista สำหรับคำสั่งนี้ ในเซิร์ฟเวอร์ W2K3 มันแบ่งออกเป็นแบน
Mike T

นั่นเป็นเพราะ XP ไม่รองรับการเชื่อมโยง นั่นเป็นคุณสมบัติใหม่สำหรับ Vista ฉันเชื่อว่าเซิร์ฟเวอร์ W2K3 ไม่รองรับ symlink เช่นกัน คุณต้องก้าวไปถึงเซิร์ฟเวอร์ W2K8 เพื่อรับการสนับสนุน symlink ฉันจะดูว่าเหตุใด symlink ใหม่จึงวางระเบิดบน W2k3 มันควรเกิดข้อผิดพลาดพร้อมข้อความคล้าย ๆ กับ XP
Keith Hill

ฉันลองทางแยกใหม่และจะได้ผลกับฉัน น่าเสียดายที่ฟังก์ชันการเชื่อมโยงไม่ได้ลดลงไปสู่จุดเชื่อมต่อใน XP และ W2K3
Mike T

ในการใช้ทางแยกใหม่ต่อไป ... ฉันได้รับทางแยกไปยังจุดแยกใหม่ อย่างไรก็ตามข้อผิดพลาด ls (หรือ get-childitem) ที่ระบุว่า .. "ชื่อไฟล์ชื่อไดเรกทอรีหรือไวยากรณ์ของไดรฟ์ข้อมูลไม่ถูกต้อง" ถ้าฉันลองและป้อนไดเรกทอรีย่อยจากที่นั่น
Mike T

2
ของ Windows ผู้ใช้ 10 คนพบคำตอบstackoverflow.com/a/34905638/195755 Windows 10 เป็นอุปกรณ์ในตัว คัดลอก / วาง: New-Item -Type และกดแท็บเพื่อวนตัวเลือกต่างๆ Hardlink, SymbolicLinkและJunctionปรากฏสำหรับฉัน ใช้งานได้กับ Win 10, Server 2016+ หรือระบบปฏิบัติการรุ่นเก่าที่ติดตั้ง Powershell 5.0 ผ่าน Windows Management Framework 5.0+
yzorg

23

ใน Windows 7 คำสั่งคือ

fsutil hardlink create new-file existing-file

PowerShell ค้นหาโดยไม่มีเส้นทางแบบเต็ม (c: \ Windows \ system32) หรือส่วนขยาย (.exe)


1
fsutil hardlinkต้องการnew-fileและexisting-fileอยู่ในไดรฟ์เดียวกัน หากสิ่งนั้นมีความสำคัญกับคุณให้ใช้คำสั่ง cmd mklink /cแทน
mopsled

9
@mopsled ฮาร์ดลิ้งโดยความหมายจะต้องอยู่ในปริมาณเดียวกับเป้าหมายนี้ไม่ได้เป็นเฉพาะข้อ จำกัดfsutil(หรือ Windows สำหรับเรื่องที่)
Dev

จะมีสิ่งที่เทียบเท่าสำหรับ symlinks และทางแยก "อ่อน"?
jshall

ทำงานบนระบบ Windows10 ได้เช่นกัน
FooF

15

ใหม่ Symlink:

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

นำ-Symlink:

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

    invoke-expression "$command $link"
}

การใช้งาน:

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

2
ของ Windows ผู้ใช้ 10 คนดูstackoverflow.com/a/34905638/195755 Windows 10 เป็นอุปกรณ์ในตัว คัดลอก / วาง: New-Item -Type และกดแท็บเพื่อวนตัวเลือกต่างๆ Hardlink, SymbolicLinkและJunctionปรากฏสำหรับฉัน ใช้งานได้กับ Win 10, Server 2016+ หรือระบบปฏิบัติการรุ่นเก่าที่ติดตั้ง Powershell 5.0 ผ่าน Windows Management Framework 5.0+
yzorg

หรือถ้าชื่อไฟล์มีอยู่
Chris Charabaruk

10

ลอง junction.exe

สนธิอรรถประโยชน์บรรทัดคำสั่งจาก SysInternals ทำให้การสร้างและการลบแยกง่าย

อ่านเพิ่มเติม

  • MS ศัพท์: นุ่ม = สัญลักษณ์
    Microsoft ใช้ลิงค์ "อ่อน"เป็นอีกชื่อหนึ่งของ"สนธิ"
    อย่างไรก็ตาม: "ลิงก์สัญลักษณ์"เป็นอย่างอื่นทั้งหมด
    ดู MSDN: ฮาร์ดลิงก์และจุดเชื่อมต่อใน Windows
    (นี่เป็นการขัดแย้งโดยตรงกับการใช้งานทั่วไปของคำเหล่านั้นที่"soft link"และ"symbolic link" ( "symlink" ) DO หมายถึงสิ่งเดียวกัน )

การใช้ยูทิลิตี้นี้อย่างถูกต้องช่วยให้ฉันสามารถแยกไดเรกทอรีอื่นและสำรวจไดเรกทอรีย่อยได้สำเร็จ ทั้งหมดใน XP และ W2K3 เพียงเพิ่ม exe ลงในไดเรกทอรีใน PATH ของคุณแล้วเรียกมันว่าปกติ
Mike T

ฉันไม่คิดว่าคุณสามารถใช้ junction.exe เพื่อสร้างลิงก์สัญลักษณ์
Jason R. Coombs

3
ใช้ดีกว่าmklinkซึ่งมาพร้อมกับ Windows หากคุณมีรุ่น Windows ซึ่งจัดส่งมาพร้อม
ลบ

5

คุณสามารถใช้ยูทิลิตี้นี้:

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

1
มันจะต้องมีสิทธิ์สูง การสร้างฮาร์ดลิงก์มักจะไม่
Joey

3

ฉันเขียนโมดูล PowerShell ที่มีโปรแกรมเสริมสำหรับ MKLINK https://gist.github.com/2891103

มีฟังก์ชั่นสำหรับ:

  • ใหม่ Symlink
  • ใหม่ hardlink
  • ใหม่สนธิ

จับเอาต์พุต MKLINK และส่งข้อผิดพลาด PowerShell ที่เหมาะสมเมื่อจำเป็น


3

ฉันรวมสองคำตอบ (@bviktor และ @jocassid) มันได้รับการทดสอบใน Windows 10 และ 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

ที่จริงแล้วคำสั่งSysinternals junctionใช้งานได้กับไดเรกทอรีเท่านั้น (อย่าถามฉันว่าทำไม) ดังนั้นจึงไม่สามารถฮาร์ดลิงก์ไฟล์ได้ ฉันจะไปกับcmd /c mklinkลิงก์อ่อน ๆ (ฉันไม่สามารถเข้าใจได้ว่าทำไม PowerShell ถึงไม่รองรับโดยตรง) หรือfsutilสำหรับฮาร์ดลิงก์

หากคุณต้องการใช้งานกับ Windows XP ฉันไม่รู้จักสิ่งอื่นใดนอกจาก Sysinternals junctionดังนั้นคุณอาจถูก จำกัด ไว้ที่ไดเรกทอรี


-1

ฉันพบวิธีนี้ง่าย ๆ โดยปราศจากความช่วยเหลือจากภายนอก ใช่มันใช้คำสั่ง archaic DOS แต่ใช้งานได้ง่ายและชัดเจน

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

สิ่งนี้ใช้คำสั่ง DOS dir เพื่อค้นหารายการทั้งหมดที่มีแอ็ตทริบิวต์ลิงก์สัญลักษณ์ตัวกรองบนชื่อลิงก์เฉพาะตามด้วยวงเล็บ "[]" เป้าหมายและสำหรับแต่ละรายการ


5
นี่เป็นคำตอบสำหรับคำถามอื่นหรือไม่?
Allanrbo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.