使用PowerShell创build硬链接和软链接
PowerShell 1.0可以创build与Unix类似的硬链接和软链接吗?
如果这不是内置的,有人可以指向我的网站有一个ps1脚本模仿呢?
这是任何好的壳,恕我直言,必要的function。 🙂
您可以通过PowerShell调用cmd
提供的mklink
来创build符号链接:
cmd /c mklink c:\path\to\symlink c:\target\file
对于硬链接,我build议像Sysinternals交界处 。
Windows 10(通常是Powershell 5.0)允许您通过New-Item cmdlet创build符号链接 。
用法:
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
build立链接时,打开Developer Mode不需要pipe理员权限:
不,它没有内置到PowerShell中,Windows Vista / Windows 7上的实用程序mklink
直接内置到cmd.exe
。 您可以使用PowerShell社区扩展 (免费)。 有几种用于各种types重新分析的cmdlet:
-
New-HardLink
, -
New-SymLink
, -
New-Junction
, -
Remove-ReparsePoint
- 和别的。
在Windows 7中,该命令是
fsutil hardlink create new-file existing-file
PowerShell找不到完整path(c:\ Windows \ system32)或扩展名(.exe)。
新符号链接:
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"
Sysinternals的Junction命令行实用程序可以轻松创build和删除符号(软)链接。 Windows中的硬链接和连接 。
你可以使用这个工具:
c:\Windows\system32\fsutil.exe create hardlink
我写了一个PowerShell模块,它有MKLINK的本地包装器。 https://gist.github.com/2891103
包括以下function:
- 新符号链接
- 新硬连接
- 新结
捕获MKLINK输出,并在必要时引发适当的PowerShell错误。
我结合了两个答案(@ bviktor和@jocassid)。 它在Windows 10和Windows Server 2012上进行了testing。
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""" } }
我没有外部的帮助,发现这个简单的方法。 是的,它使用一个古老的DOS命令,但它的工作原理很简单,而且很清楚。
$target = cmd /c dir /a:l | ? { $_ -match "mySymLink \[.*\]$" } | % ` { $_.Split([char[]] @( '[', ']' ), [StringSplitOptions]::RemoveEmptyEntries)[1] }
这使用DOS dir命令查找具有符号链接属性的所有条目,在特定链接名称后面跟着目标“[]”括号进行过滤,并且对于每一个(大概是一个),只提取目标string。
实际上, Sysinternals junction
命令只能用于目录(不要问我为什么),所以它不能硬连接文件。 我会去cmd /c mklink
的软链接(我不明白为什么它不直接支持PowerShell),或fsutil
的硬链接。
如果你需要它在Windows XP上工作,我不知道除了Sysinternals junction
以外的任何东西,所以你可能只限于目录。