使用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-Itembuild立链接时,打开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以外的任何东西,所以你可能只限于目录。