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


226

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

如果这不是内置的,那么有人可以将我指向一个具有模仿该脚本的ps1脚本的网站吗?

这是任何好的shell(恕我直言)的必要功能。:)


6
Windows 10用户请访问stackoverflow.com/a/34905638/195755。Windows 10它内置的。复制/粘贴:New-Item -Type 并按Tab键循环浏览选项。 HardlinkSymbolicLink然后Junction为我出现。通过Windows Management Framework 5.0+安装了Powershell 5.0+的Works Win 10,Server 2016+或更旧的操作系统。
yzorg

2
我不能找到体面MSDN / TechNet文档New-Item -Type HardLink也不New-Item -Type SymbolicLink。New-Item docs链接至help about_Providers,建议您阅读每个提供商的帮助(未链接)。但是,如果您使用google进行搜索,则在PowerShell社区周围会有很多嗡嗡声New-Item -Type HardLink。看起来,PowerShell工程团队提出了提供程序扩展点,从而使文档团队感到困惑。
yzorg

Answers:


253

您可以从PowerShell 调用mklink提供者cmd,以建立符号链接:

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

如果目标是目录/dmklink则必须传递到。

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

对于硬链接,我建议使用Sysinternals Junction之类的东西。


29
如果你有一个PowerShell配置文件,也可以进行快速的功能function mklink { cmd /c mklink $args }
乔扬

14
并且如果您要建立目录链接,则命令将类似于{cmd / c mklink / D“ toDir” fromDir}
DavidDraughn 2012年

9
将/ H参数添加到mklink将创建硬链接,而无需诸如Sysinternals Junction之类的第三方程序。
Fopedush

3
我认为jocassid有更好的答案。恕我直言,我们应该尝试讲授如何使用PowerShell,而不是通过cmd.exe使用漏洞和黑客程序。
卡梅隆·奥肯利夫


266

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

在此处输入图片说明


2
由于MS重新排列文档,此链接现在已断开。我在technet.microsoft.com/zh-cn/library/hh849795.aspx中
Aaron Thomas

3
New-Item -Path C:\ LinkDir -ItemType SymbolicLink -Value F:\ RealDir
Daniel Fisher lennybacon

7
从Windows v1703开始,mklink允许创建符号链接而无需提升帐户权限,如果在“设置”中启用了“开发人员”模式,则“新建项目”则不启用。希望在下一个更新中。
papo

迷人。因此,这与资源管理器.lnk快捷方式截然不同。在资源管理器中,同名的快捷方式和符号链接并排显示,好像什么都没错。他们的行为略有不同。符号链接后的“资源管理器”栏中显示了绝对路径。遵循快捷方式,将其视为符号链接父目录是真正的父目录。
BaseZen

1
有了接受的答案,我就可以使用相对路径,而New-ItemCommandlet 则不是这样。
Dave F

41

添加“ pscx”模块

不,它不是PowerShell内置的。而且该mklink实用程序无法在Windows Vista / Windows 7上单独调用,因为它是作为“内部命令” 直接cmd.exe内置的

您可以使用PowerShell社区扩展(免费)。有几个cmdlet可用于修复各种类型的点:

  • New-HardLink
  • New-SymLink
  • New-Junction
  • Remove-ReparsePoint
  • 和别的。

1
很好的尝试。虽然如果要在x32或x64中运行XP或W2K3服务器,则New-Symlink无效。在XP中,它会礼貌地告诉您应该为该命令运行Vista。在W2K3服务器中,中断中断。
Mike T

那是因为XP不支持符号链接。这是Vista的新增功能。我相信W2K3服务器也不支持符号链接。您必须升级到W2K8服务器才能获得符号链接支持。我将研究为什么new-symlink在W2k3上遭到轰炸,它会因与XP类似的消息而出错。
基思·希尔

我尝试了新结,它将为我工作。太糟糕了链接功能不降低在XP和W2K3路口
麦克ŧ

在进一步使用new-junction时...我将连接到新的解析点。但是,ls(或get-childitem)错误指出。.“如果文件名,目录名或卷标语法不正确,请尝试从那里输入子目录。
Mike T

2
Windows 10用户请参阅答案stackoverflow.com/a/34905638/195755。Windows 10它内置的。复制/粘贴:New-Item -Type 并按Tab键循环浏览选项。 HardlinkSymbolicLink然后Junction为我出现。通过Windows Management Framework 5.0+安装了Powershell 5.0的Works Win 10,Server 2016+或更旧的操作系统。
yzorg

23

在Windows 7中,命令为

fsutil hardlink create new-file existing-file

PowerShell找不到完整路径(c:\ Windows \ system32)或扩展名(.exe)的文件。


1
fsutil hardlink要求new-fileexisting-file位于同一驱动器上。如果这对您很重要,请改用cmd mklink /c
拖曳

9
根据定义,@ mopsled硬链接必须与目标位于相同的卷上,这不是特定于fsutil(或Windows)的限制
2015年

“软”符号链接和连接是否等效?
jshall 2015年

在Windows10系统上也可以使用。
FooF

15

新符号链接:

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"

2
Windows 10用户请访问stackoverflow.com/a/34905638/195755。Windows 10它内置的。复制/粘贴:New-Item -Type 并按Tab键循环浏览选项。 HardlinkSymbolicLink然后Junction为我出现。通过Windows Management Framework 5.0+安装了Powershell 5.0的Works Win 10,Server 2016+或更旧的操作系统。
yzorg

或者,如果文件名包含它们。
克里斯·查拉巴鲁克

10

尝试junction.exe

SysInternals命令行实用程序使创建和删除联结变得容易。

进一步阅读

  • MS术语:soft!=符号
    Microsoft使用“ soft link”作为“ junction”的另一个名称。
    但是:“符号链接”完全是另外一回事。
    请参见MSDN:Windows中的硬链接和连接
    (这与“软链接”“符号链接”“ symlink”)的含义相同的那些术语的一般用法直接矛盾。)

正确使用此实用程序使我可以联结另一个目录并成功遍历该目录的子目录。全部在XP和W2K3中。只需将exe添加到PATH中的目录中,然后像平常一样调用它即可。
Mike T

我认为您不能使用junction.exe创建符号链接。
詹森·库姆斯

3
mklinkWindows 最好使用它。如果您附带Windows版本。
2012年

5

您可以使用此实用程序:

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

1
但是,这将需要提升的特权。创建硬链接通常不会。
乔伊(Joey)

3

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

包括以下功能:

  • 新符号链接
  • 新硬链接
  • 新结

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


3

我结合了两个答案(@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"""
    }
}

1

实际上,Sysinternals junction命令仅适用于目录(不要问我为什么),因此它不能硬链接文件。我会使用cmd /c mklink软链接(我不知道为什么PowerShell不直接支持它)或fsutil硬链接。

如果您需要它在Windows XP上运行,除了Sysinternals之外,我什么都不知道junction,因此您可能只限于目录。


-1

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

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

这使用DOS dir命令查找具有符号链接属性的所有条目,对特定链接名称进行过滤,后跟目标“ []”括号,对于每个括号(大概是一个),仅提取目标字符串。


5
这是另一个问题的答案吗?
阿兰博
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.