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

时间:2009-05-21 18:41:22

标签: powershell symlink

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

如果没有内置,有人可以指向我的网站,其中有一个模仿此内容的ps1脚本吗?

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

11 个答案:

答案 0 :(得分:232)

您可以从PowerShell调用mklink提供的cmd来制作符号链接:

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

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

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

对于硬链接,我建议使用Sysinternals Junction

答案 1 :(得分:216)

Windows 10(以及一般的Powershell 5.0)允许您create symbolic links via the 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

答案 2 :(得分:39)

不,它没有内置到PowerShell中,Windows Vista / Windows 7上的实用程序mklink直接构建到cmd.exe。您可以使用PowerShell Community Extensions(免费)。有几种cmdlet用于各种类型的重新分析点:

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

答案 3 :(得分:23)

在Windows 7中,命令为

fsutil hardlink create new-file existing-file

PowerShell在没有完整路径(c:\ Windows \ system32)或扩展名(.exe)的情况下找到它。

答案 4 :(得分: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"

答案 5 :(得分:10)

Sysinternals的Junction命令行实用程序可以轻松创建和删除符号(软)链接。 Windows中的Hard Links and Junctions

答案 6 :(得分:5)

您可以使用此实用程序:

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

答案 7 :(得分:3)

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

包括以下功能:

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

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

答案 8 :(得分: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"""
    }
}

答案 9 :(得分:1)

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

如果你需要它在Windows XP上工作,除了Sysinternals junction之外我什么都不知道,所以你可能只限于目录。

答案 10 :(得分:0)

我发现这很简单,没有外部帮助。是的,它使用了一个古老的DOS命令,但它很有效,很简单,而且很明显。

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

这使用DOS dir命令查找具有符号链接属性的所有条目,在特定链接名称后面跟上目标“[]”括号,对于每个 - 大概是一个 - 只提取目标字符串。