使用PowerShell创建硬链接和软链接

PowerShell 1.0可以创建类似Unix的硬链接和软链接吗?

如果这不是内置的,有人能告诉我一个网站,有一个ps1脚本模仿这个吗?

恕我直言,这是任何优秀shell的必要功能。:)

246433 次浏览

添加“pscx"模块

不,它不是内置在PowerShell中。并且在Windows Vista/Windows 7上不能单独调用mklink实用程序,因为它是作为“内部命令”直接内置到cmd.exe中;

你可以使用PowerShell社区扩展(免费)。对于不同类型的重解析点,有几个cmdlet:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • 和其他人。

你可以使用这个实用程序:

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

尝试junction.exe

来自SysInternals的命令行实用程序可以轻松地创建和删除连接。

进一步的阅读

    <李> MS术语:软!=符号
    微软使用“软link"作为“junction"的另一个名称。
    然而,“象征性link"完全是另一回事。
    参见Windows中的MSDN: 硬连接和连接
    (这与“软link"“象征性link" (“symlink") 意思是一样的吗.)这些术语的一般用法直接矛盾

你可以从PowerShell调用cmd提供的mklink来建立符号链接:

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

如果目标是目录,则必须将/d传递给mklink

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

对于硬链接,我建议使用Sysinternals的结这样的方法。

实际上,Sysinternals的 junction命令只适用于目录(不要问我为什么),所以它不能硬链接文件。我会用cmd /c mklink作为软链接(我不明白为什么PowerShell不直接支持它),或者用fsutil作为硬链接。

如果你需要它在Windows XP上工作,我不知道Sysinternals junction之外的任何东西,所以你可能仅限于目录。

在Windows 7下,命令为

fsutil hardlink create new-file existing-file

PowerShell发现它没有完整的路径(c:\Windows\system32)或扩展名(.exe)。

我写了一个PowerShell模块,它有MKLINK的本机包装器。https://gist.github.com/2891103

包括以下函数:

  • New-Symlink
  • New-HardLink
  • New-Junction

捕获MKLINK输出并在必要时抛出适当的PowerShell错误。

我发现这是一种无需外界帮助的简单方法。是的,它使用了一个古老的DOS命令,但它很有效,很简单,很清楚。

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

它使用DOS dir命令来查找带有符号链接属性的所有条目,过滤目标“[]”括号后面的特定链接名称,并且对于每个条目(假设只有一个)只提取目标字符串。

New-Symlink:

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

Remove-Symlink:

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"

Windows 10(和Powershell 5.0一般)允许您通过New-Item 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建立链接时不需要管理员权限:

enter image description here

我结合了两个答案(@bviktor和@jocassid)。在Windows 10和Windows Server 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"""
}
}