5
作成するのは簡単ではありませんシンボリックリンクをpowershell 5.1で簡単に作成できます。 New-Item
が期待どおりに動作しません。以下にいくつかのアプローチを示します。何か不足していますか?すべての例について相対的なシンボリックリンクの作成方法は?
サンプルのセットアップ:
mkdir C:\Temp\foo -ErrorAction SilentlyContinue
'sample contents' > C:\Temp\foo\foo.txt
cd C:\Temp
サンプル1:期待
#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
サンプル2としてない作業を行います。期待
#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は、Unicode APIエントリし、GetLastErrorに更新されてい
のPowerShell 6は、レゾルバをグロブ介しシンボリックリンクの完全なパスに(https://github.com/PowerShell/PowerShell/commit/3a43126a2ea163f38c8d02c8177c79e954576ec6)新商品のターゲット【解決を停止しました]。それまでは回避策を使用する必要があります。 – wOxxOm
@wOxxOm:情報ありがとうございました –
@wOxxOm:残念ながら、あなたがリンクするコミットは、指定されたパスを絶対パスに解決する振る舞いを変更することなく、存在しないアイテムをターゲットにする機能を追加しました(存在しないターゲット絶対パスに変換されます)。私は相対ターゲットを求めるために[このGitHubの問題](https://github.com/PowerShell/PowerShell/issues/3500)を作成しました。 – mklement0