PowerShell का उपयोग करके हार्ड और सॉफ्ट लिंक बनाना


226

क्या PowerShell 1.0 यूनिक्स किस्म के अनुरूप कठोर और सॉफ्ट लिंक बना सकता है?

यदि यह नहीं बनाया गया है, तो क्या कोई मुझे ऐसी साइट पर इंगित कर सकता है, जिसके पास ps1 स्क्रिप्ट है जो इसे नकल करता है?

यह किसी भी अच्छे शेल, आईएमएचओ का एक आवश्यक कार्य है। :)


6
विंडोज 10 उपयोगकर्ताओं को stackoverflow.com/a/34905638/195755 देखें । Windows 10 यह है निर्मित। कॉपी / पेस्ट करें: New-Item -Type और विकल्पों के माध्यम से चक्र करने के लिए टैब दबाएं। Hardlink, SymbolicLinkऔर Junctionमेरे लिए प्रकट होते हैं। विन 10, सर्वर 2016+ या पुराने OS के साथ Powershell 5.0+ काम करता है जो विंडोज मैनेजमेंट फ्रेमवर्क 5.0+ द्वारा स्थापित है।
yzorg

2
मैं के लिए सभ्य MSDN / TechNet प्रलेखन नहीं मिल रहा है New-Item -Type HardLinkऔर न ही New-Item -Type SymbolicLink। नया-आइटम डॉक्स लिंक करता है help about_Providers, यह आपको प्रत्येक प्रदाता (जो लिंक नहीं है) के लिए मदद पढ़ने का सुझाव देता है। लेकिन अगर आप इसे Google करते हैं तो आसपास PowerShell समुदाय में बहुत चर्चा है New-Item -Type HardLink। ऐसा लगता है कि PowerShell इंजीनियरिंग टीम प्रदाता विस्तार बिंदुओं के साथ आई है जो डॉक्स टीम को स्टंप करती है।
yzorg

जवाबों:


253

प्रतीकात्मक लिंक बनाने के लिए आप PowerShell से mklinkप्रदान किए गए कॉल कर सकते हैं cmd:

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

आप गुजरना होगा /dकरने के लिए mklinkकरता है, तो लक्ष्य एक निर्देशिका है।

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

हार्ड लिंक के लिए, मैं कुछ सुझाव देता हूं जैसे Sysinternals Junction


29
यदि आपके पास एक पॉवरशेल प्रोफ़ाइल है, तो आप एक त्वरित कार्य भी कर सकते हैंfunction mklink { cmd /c mklink $args }
जो यंग

14
और यदि आप एक निर्देशिका लिंक बनाना चाहते हैं, तो कमांड कुछ इस तरह होगी जैसे {cmd / c mklink / D "toDir" fromDir}
DavidDraughn

9
mklink के लिए / H पैरामीटर को जोड़ने से Sysinternals Junction जैसे तीसरे पक्ष के कार्यक्रम की आवश्यकता के बिना एक कठिन लिंक बन जाएगा।
फोपेडुश

3
मुझे लगता है कि jocassid का बेहतर जवाब है। IMHO, हमें यह सिखाने की कोशिश करनी चाहिए कि कैसे cmd.exe के माध्यम से शोषण और हैक का उपयोग न करें।
कैमरन ओकलेनफेल


266

विंडोज 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
डैनियल फिशर लेन्नेबाकॉन

7
Windows v1703 के बाद से, mklink खाते के उत्थान के बिना सहानुभूति बनाने की अनुमति देता है, यदि डेवलपर मोड सेटिंग्स में सक्षम है, तो नया-आइटम नहीं। उम्मीद है कि अगले अपडेट में।
पापो

चित्त आकर्षण करनेवाला। तो यह एक एक्सप्लोरर .lnkशॉर्टकट से काफी अलग है । अन्वेषक में, उसी नाम के एक शॉर्टकट और सिमिलिंक को साथ-साथ प्रदर्शित करते हैं जैसे कि कुछ भी नहीं था। उनके व्यवहार सूक्ष्म रूप से भिन्न हैं; सिम्लिंक का पालन एक्सप्लोरर बार में निरपेक्ष पथ दिखाता है। शॉर्टकट का पालन करने से ऐसा लगता है जैसे सिम्पीनल पैरेंट डायर ही सच्चा पेरेंट है।
बेसजेन

1
साथ स्वीकार किए जाते हैं जवाब , मैं संबंधित पथ है, जो के साथ ऐसा नहीं था का उपयोग करने में सक्षम था New-Itemcommandlet।
डेव एफ

41

"Pscx" मॉड्यूल जोड़ें

नहीं, यह PowerShell में नहीं बनाया गया है। और mklinkउपयोगिता को विंडोज विस्टा / विंडोज 7 पर अपने दम पर नहीं बुलाया जा सकता क्योंकि इसे सीधे cmd.exe"आंतरिक कमांड" के रूप में बनाया गया है

आप PowerShell सामुदायिक एक्सटेंशन (निःशुल्क) का उपयोग कर सकते हैं । विभिन्न प्रकारों के प्रत्यावर्ती बिंदुओं के लिए कई cmdlets हैं:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • और दूसरे।

1
अच्छा प्रयास। हालाँकि अगर आप x32 या x64 में XP या W2K3 सर्वर चलाना चाहते हैं, तो न्यू-सिमलिंक काम नहीं करेगा। XP में यह विनम्रता से आपको बताएगा कि आपको इस कमांड के लिए Vista चलना चाहिए। W2K3 सर्वर में, यह फ्लैट आउट हो जाता है।
माइक टी

ऐसा इसलिए है क्योंकि XP ​​सहानुभूति का समर्थन नहीं करता है। यह विस्टा के लिए एक नई सुविधा है। मेरा मानना ​​है कि W2K3 सर्वर सीमलिंक का समर्थन नहीं करता है। आपको सीलिंक समर्थन प्राप्त करने के लिए W2K8 सर्वर तक कदम रखना होगा। मैं इस बात पर ध्यान दूंगा कि W2k3 पर नया-सिमलिंक क्यों बमबारी कर रहा है, इसे XP के समान संदेश के साथ त्रुटि होनी चाहिए।
कीथ हिल

मैंने नया-जंक्शन की कोशिश की और वह मेरे लिए काम करेगा। बहुत खराब लिंक कार्यक्षमता XP और W2K3 में जंक्शनों को नीचा नहीं करती है
माइक टी

नए जंक्शन के आगे उपयोग पर ... मुझे नए पार्स बिंदु पर जंक्शन मिलता है। हालाँकि ls (या get-childitem) त्रुटियां बताते हुए कि .. "फ़ाइल नाम, निर्देशिका नाम या वॉल्यूम लेबल सिंटैक्स गलत है" यदि मैं कोशिश करता हूं और वहां से एक उपनिर्देशिका दर्ज करता हूं।
माइक टी

2
विंडोज 10 उपयोगकर्ताओं को उत्तर stackoverflow.com/a/34905638/195755 देखें । Windows 10 यह है निर्मित। कॉपी / पेस्ट करें: New-Item -Type और विकल्पों के माध्यम से चक्र करने के लिए टैब दबाएं। Hardlink, SymbolicLinkऔर Junctionमेरे लिए प्रकट होते हैं। विन 10, सर्वर 2016+ या पुराने OS के साथ Powershell 5.0 काम करता है जो विंडोज मैनेजमेंट फ्रेमवर्क 5.0+ द्वारा स्थापित है।
20

23

विंडोज 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(या उस मामले के लिए विंडोज)
देव

क्या "सॉफ्ट" सिमिलिंक और जंक्शन के लिए एक समान है?
jshall

एक Windows10 सिस्टम पर भी काम किया।
FooF

15

नई सिमलिंक:

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

निकालें-सिमलिंक:

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
विंडोज 10 उपयोगकर्ताओं को stackoverflow.com/a/34905638/195755 देखें । Windows 10 यह है निर्मित। कॉपी / पेस्ट करें: New-Item -Type और विकल्पों के माध्यम से चक्र करने के लिए टैब दबाएं। Hardlink, SymbolicLinkऔर Junctionमेरे लिए प्रकट होते हैं। विन 10, सर्वर 2016+ या पुराने OS के साथ Powershell 5.0 काम करता है जो विंडोज मैनेजमेंट फ्रेमवर्क 5.0+ द्वारा स्थापित किया गया है।
२०:५० पर yzorg

या यदि फ़ाइल नाम में वे शामिल हैं।
बजे क्रिस चारबारुक

10

Junction.exe का प्रयास करें

जंक्शन SysInternals से कमांड लाइन उपयोगिता बनाने और आसान जंक्शनों को हटाने बनाता है।

आगे की पढाई

  • एमएस शब्दावली: सॉफ्ट! = प्रतीकात्मक
    माइक्रोसॉफ्ट "जंक्शन" के लिए एक और नाम के रूप में "सॉफ्ट लिंक" का उपयोग करता है । हालाँकि: "प्रतीकात्मक लिंक" पूरी तरह से कुछ और है। MSDN देखें: विंडोज़ में हार्ड लिंक और जंक्शन । (यह उन शब्दों के सामान्य उपयोग के प्रत्यक्ष विरोधाभास में है जहां "सॉफ्ट लिंक" और "प्रतीकात्मक लिंक" ( "सिमलिंक" ) का मतलब एक ही बात है ।)



इस उपयोगिता का उपयोग सही ढंग से मुझे एक और निर्देशिका को जंक्शन करने की अनुमति देता है और इसे सफलतापूर्वक उपनिर्देशिकाएं पार करता है। सभी XP और W2K3 में। बस अपने पथ में एक निर्देशिका के लिए exe जोड़ें और इसे सामान्य की तरह कॉल करें।
माइक टी

मुझे नहीं लगता कि प्रतीकात्मक लिंक बनाने के लिए आप j जंक्शन.exe का उपयोग कर सकते हैं।
जेसन आर। कोम्ब्स

3
यह mklinkविंडोज के साथ भेज दिया जाता है, जो उपयोग करने के लिए बेहतर है । यदि आपके पास एक Windows संस्करण है जिसे इसके साथ शिप किया गया है।
नष्ट कर दिया

5

आप इस उपयोगिता का उपयोग कर सकते हैं:

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

1
हालांकि इसके लिए विशेषाधिकारों की आवश्यकता होगी। हार्डलिंक बनाना आमतौर पर नहीं होता है।
जॉय

3

मैंने एक PowerShell मॉड्यूल लिखा है जिसमें MKLINK के मूल निवासी रैपर हैं। https://gist.github.com/2891103

के लिए कार्य शामिल हैं:

  • नई सिमलिंक
  • नई hardlink
  • नई जंक्शन

MKLINK आउटपुट को कैप्चर करता है और आवश्यक होने पर उचित PowerShell त्रुटियाँ फेंकता है।


3

मैंने दो उत्तरों (@bviktor और @jocassid) को संयोजित किया। यह विंडोज 10 और विंडोज सर्वर 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सॉफ्ट लिंक्स के लिए जाऊंगा (मैं यह पता नहीं लगा सकता कि यह सीधे fsutilपॉवरशेल द्वारा समर्थित क्यों नहीं है), या हार्डलिंक के लिए।

यदि आपको Windows XP पर काम करने की आवश्यकता है, तो मुझे Sysinternals के अलावा कुछ भी नहीं पता है junction, इसलिए आप निर्देशिकाओं तक सीमित हो सकते हैं।


-1

मुझे बाहरी मदद के बिना यह सरल तरीका लगा। हां, यह एक पुरातन डॉस कमांड का उपयोग करता है लेकिन यह काम करता है, यह आसान है, और यह स्पष्ट है।

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

यह प्रतीकात्मक लिंक विशेषता के साथ सभी प्रविष्टियों को खोजने के लिए डॉस डीर कमांड का उपयोग करता है, लक्ष्य के बाद विशिष्ट लिंक नाम पर फिल्टर "[]" कोष्ठक, और प्रत्येक के लिए - संभवतः एक - लक्ष्य स्ट्रिंग निकालता है।


5
क्या यह एक अलग सवाल का जवाब है?
एलनबरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.