2017-02-28 22 views
5

Powershell 5.1'deki sembolik bağlarının oluşturulması o kadar kolay değildir. New-Item beklendiği gibi çalışmıyor. Bazı yaklaşımlar aşağıda listelenmiştir. Bir şey mi eksik? Tüm örnekler içinGöreli sembolik bağlantı yolu yolu nasıl oluşturulur?

Numune kurulumu:

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

Sample1: değil eser

#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 beklendiği mu gibidir: değil eser

#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 beklendiği mu olarak 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 beklendiği gibi çalışır: beklendiği gibi çalışır

#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 

Düzenleme: Sample3 unicode API giriş ve GetLastError olarak güncellendi

+4

PowerShell 6 çözümleyicinizi globbing yoluyla sembolik bağlar için tam bir yola (https://github.com/PowerShell/PowerShell/commit/3a43126a2ea163f38c8d02c8177c79e954576ec6) Yeni-öğesinin hedefini [çözme durduruldu]. O zamana kadar geçici çözümler kullanmanız gerekecek. – wOxxOm

+0

@wOxxOm: bilgi için teşekkürler –

+2

@wOxxOm: Maalesef, bağladığınız taahhüt, önceden var olmayan öğeleri hedefleme yeteneğini, önceden belirlenmiş yolun mutlak yoluna çözümleme davranışını değiştirmeden eklemiştir (hatta varolmayan hedefler bile) mutlak yollara dönüştürülür). Göreli hedefler sormak için [bu GitHub sorunu] 'nu (https://github.com/PowerShell/PowerShell/issues/3500) oluşturdum. – mklement0

cevap

0
Sen $ PROFİLDEN için bu işlevi ekleyerek deneyebilirsiniz

.

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 
} 
İlgili konular