277

PowerShell 1.0 能否创建类似于 Unix 的硬链接和软链接?

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

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

4

11 回答 11

346

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

在此处输入图像描述

于 2016-01-20T16:41:00.897 回答
283

您可以从 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 之类的东西。

于 2011-04-05T09:07:51.260 回答
45

添加“pscx”模块

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

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

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • 和别的。
于 2009-05-21T19:23:24.643 回答
24

在 Windows 7 中,命令是

fsutil hardlink create new-file existing-file

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

于 2012-04-10T13:18:58.883 回答
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"
于 2013-10-24T14:02:57.337 回答
10

试试 junction.exe

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

进一步阅读

  • MS 术语:soft != symbolic
    Microsoft 使用“软链接”作为“连接”的另一个名称
    但是:“符号链接”完全是另外一回事。
    请参阅 MSDN: Windows 中的硬链接和连接(这与“软链接”“符号链接”“符号链接”确实表示相同含义的
    那些术语的一般用法直接矛盾。)
于 2009-05-21T20:59:40.737 回答
5

您可以使用此实用程序:

c:\Windows\system32\fsutil.exe create hardlink
于 2009-05-21T20:41:09.793 回答
5

我结合了两个答案(@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"""
    }
}
于 2017-04-03T19:55:07.483 回答
3

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

包括以下功能:

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

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

于 2012-06-07T20:31:01.743 回答
1

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

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

于 2011-04-29T15:36:18.807 回答
-2

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

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

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

于 2013-04-10T15:31:21.203 回答