2017-02-28 13 views
5

सापेक्ष पावरहेल 5.1 में प्रतीकात्मक लिंक बनाना इतना आसान नहीं है। New-Item अपेक्षित के रूप में काम नहीं कर रहा है। कुछ दृष्टिकोण नीचे सूचीबद्ध हैं। क्या मैं कुछ भूल रहा हूँ? सभी उदाहरण के लिएसापेक्ष सिम्लिंक शक्तियों को कैसे बनाया जाए?

नमूना सेटअप:

mkdir C:\Temp\foo -ErrorAction SilentlyContinue 
'sample contents' > C:\Temp\foo\foo.txt 
cd C:\Temp 

Sample1: नहीं काम के रूप में उम्मीद है

#new ps5 Item cmdlets (https://msdn.microsoft.com/en-us/powershell/wmf/5.0/feedback_symbolic) are not working well with relative paths 
#C:\Temp\foo and C:\Temp\foo\foo.txt are returned 
$fld = New-Item -ItemType SymbolicLink -Name 'bar' -Target '.\foo' 
$fl = New-Item -ItemType SymbolicLink -Name 'bar.txt' -Target '.\foo\foo.txt' 
$fld.Target 
$fl.Target 

Sample2: नहीं काम की उम्मीद

#Powershell community extensions 
#same problem - paths are created as absolute: C:\Temp\foo C:\Temp\foo\foo.txt 
$fld = New-Symlink 'c:\Temp\bar' '.\foo' 
$fl = New-Symlink 'c:\Temp\bar.txt' '.\foo\foo.txt' 
$fld.Target 
$fl.Target 

samp के रूप में करता है LE3: काम करता है के रूप में की उम्मीद

#API call CreateSymbolicLink as per https://gallery.technet.microsoft.com/scriptcenter/new-symlink-60d2531e 
#.\foo and .\foo\foo.txt are returned 
Add-Type -MemberDefinition @' 
    [DllImport("kernel32.dll", EntryPoint = "CreateSymbolicLinkW", CharSet = CharSet.Unicode, SetLastError = true)] 
    public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags); 

    public static DirectoryInfo CreateSymbolicLinkToFolder(string lpSymlinkFileName, string lpTargetFileName) { 
     bool res = CreateSymbolicLink(lpSymlinkFileName, lpTargetFileName, 1); 
     if (!res) { throw new Win32Exception(Marshal.GetLastWin32Error()); } 
     return (new DirectoryInfo(lpSymlinkFileName)); 
    } 

    public static FileInfo CreateSymbolicLinkToFile(string lpSymlinkFileName, string lpTargetFileName) { 
     bool res = CreateSymbolicLink(lpSymlinkFileName, lpTargetFileName, 0); 
     if (!res) { throw new Win32Exception(Marshal.GetLastWin32Error()); } 
     return (new FileInfo(lpSymlinkFileName)); 
    } 
'@ -Name Win32 -NameSpace System -UsingNamespace System.ComponentModel, System.IO 
[Win32]::CreateSymbolicLinkToFolder("c:\Temp\bar", ".\foo") 
[Win32]::CreateSymbolicLinkToFile("c:\Temp\bar.txt", ".\foo\foo.txt") 

Sample4: उम्मीद के रूप में काम करता है

#using mklink from cmd produces correct relative paths 
#.\foo and .\foo\foo.txt are returned 
cmd /c mklink /d "c:\Temp\bar" ".\foo" 
cmd /c mklink "c:\Temp\bar.txt" ".\foo\foo.txt" 
(Get-Item "c:\Temp\bar").Target 
(Get-Item "c:\Temp\bar.txt").Target 

संपादित करें: Sample3 यूनिकोड एपीआई प्रवेश और GetLastError को अद्यतन किया गया है

+4

PowerShell 6 समाधानकर्ता ग्लोबिंग के माध्यम से सिमलिंक के लिए एक पूर्ण पथ के लिए (https://github.com/PowerShell/PowerShell/commit/3a43126a2ea163f38c8d02c8177c79e954576ec6) नई-मद के लक्ष्य [हल करने बंद कर दिया]। तो तब तक आपको वर्कअराउंड का उपयोग करना होगा। – wOxxOm

+0

@wOxxOm: जानकारी के लिए धन्यवाद –

+2

@wOxxOm: दुर्भाग्यवश, जो प्रतिबद्धता आप केवल मौजूदा पथ को निर्दिष्ट पथ को हल करने के व्यवहार को बिना किसी मौजूदा पथ को हल करने के व्यवहार को बदलने के लिए जोड़ती है (यहां तक ​​कि अस्तित्वहीन लक्ष्य भी नहीं पूर्ण पथ में परिवर्तित कर रहे हैं)। मैंने सापेक्ष लक्ष्यों के लिए पूछने के लिए [यह गिटहब मुद्दा] बनाया है (https://github.com/PowerShell/PowerShell/issues/3500)। – mklement0

उत्तर

0

आप अपने $ शख्सियत को यह समारोह जोड़कर भी देख सकते ।

Function SymbolicLink-Add 
{ 
[CmdLetBinding()] 
Param ([string] $File, [string] $SymbolicLinkFolder) 

$LinkFile = (Get-Item $File) 

if ($false -eq $LinkFile.Exists) 
{ 
    return "Cannot create symbolic link file does not exist: [$File]" 
} 

if ($false -eq (Test-Path $SymbolicLinkFolder)) 
{ 
    New-Item -Type Directory -Path $SymbolicLinkFolder 
    -ErrorAction Stop 
} 

New-Item -ItemType SymbolicLink -Path $SymbolicLinkFolder -Name 
$LinkFile.Name -Value $LinkFile 
} 
संबंधित मुद्दे