ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

Windows 10 用户看到 stackoverflow.com/a/34905638/195755 。 Windows 10 内置的。复制/粘贴:New-Item -Type 并按 Tab 循环浏览选项。 HardlinkSymbolicLinkJunction 为我显示。适用于 Win 10、Server 2016+ 或更早版本的操作系统,通过 Windows Management Framework 5.0+ 安装了 Powershell 5.0+。
我找不到适合 New-Item -Type HardLinkNew-Item -Type SymbolicLink 的 MSDN/TechNet 文档。新项目文档链接到 help about_Providers,它建议您阅读每个提供者的帮助(未链接)。但是,如果您在 Google 上搜索它,就会在 PowerShell 社区中围绕 New-Item -Type HardLink 进行大量讨论。看起来 PowerShell 工程团队提出了 provider 扩展点,这些扩展点让 docs 团队望而却步。
WARNING! -- 虽然创建硬链接 非常容易,但安全地删除它们可能是一个相当大的挑战。这是因为这些工具在本机 Powershell 中不容易使用,而 Windows 喜欢锁定文件访问并将文件保存在内存中(因此在不重新启动的情况下并不总是可以删除。)请参阅我的帖子 here

M
Martin Schneider

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 建立链接时不需要管理员权限:

https://i.stack.imgur.com/1HYya.png


由于 MS 重新排列文档,此链接现已断开。我在 technet.microsoft.com/en-us/library/hh849795.aspx 找到了一个当前可用的链接
新项目 - 路径 C:\LinkDir -ItemType SymbolicLink -Value F:\RealDir
从 Windows v1703 开始,mklink 允许在没有帐户提升的情况下创建符号链接,如果在设置中启用了开发人员模式,则 New-Item 不会。希望在下一次更新中。
使用 accepted answer,我能够使用相对路径,而 New-Item commandlet 则不然。
New-Item 允许对文件使用 HardLink-ItemType,对目录使用 Junction。这些不需要开发人员模式或管理员权限。
D
Dave F

您可以从 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 Junction


如果您有 powershell 配置文件,您还可以制作一个快速函数 function mklink { cmd /c mklink $args }
如果你想建立一个目录链接,命令将类似于 { cmd /c mklink /D "toDir" fromDir }
将 /H 参数添加到 mklink 将创建一个硬链接,而不需要像 Sysinternals Junction 这样的第三方程序。
我认为jocassid有更好的答案。恕我直言,我们应该尝试教如何使用 PowerShell,而不是通过 cmd.exe 使用漏洞和黑客。
C
Community

添加“pscx”模块

不,它没有内置在 PowerShell 中。并且 mklink 实用程序不能在 Windows Vista/Windows 7 上单独调用,因为它是 built directly into cmd.exe as an "internal command"

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

新硬链接,

新符号链接,

新结,

删除-ReparsePoint

和别的。


不错的尝试。虽然如果你想在 x32 或 x64 中运行 XP 或 W2K3 服务器,New-Symlink 不起作用。在 XP 中,它会礼貌地告诉您,您应该为此命令运行 Vista。在 W2K3 服务器中,它完全中断了。
那是因为 XP 不支持符号链接。这是 Vista 的一项新功能。我相信 W2K3 服务器也不支持符号链接。您必须升级到 W2K8 服务器才能获得符号链接支持。我将研究为什么 new-symlink 在 W2k3 上轰炸,它应该与 XP 类似的消息出错。
我尝试了 new-junction ,这对我有用。太糟糕了,链接功能不会降级为 XP 和 W2K3 中的连接点
关于进一步使用 new-junction... 我得到了一个到新解析点的连接点。但是 ls (或 get-childitem) 错误指出..“文件名、目录名或卷标语法不正确”如果我尝试从那里输入子目录。
Windows 10 用户看到答案 stackoverflow.com/a/34905638/195755 。 Windows 10 它 内置的。复制/粘贴:New-Item -Type 并按 Tab 循环浏览选项。 HardlinkSymbolicLinkJunction 为我显示。适用于 Win 10、Server 2016+ 或更旧的操作系统,通过 Windows Management Framework 5.0+ 安装了 Powershell 5.0。
q
quigi

在 Windows 7 中,命令是

fsutil hardlink create new-file existing-file

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


fsutil hardlink 要求 new-fileexisting-file 位于同一驱动器上。如果这对您很重要,请改用 cmd 的 mklink /c
根据定义,@mopsled 硬链接必须与目标位于同一卷上,这不是特定于 fsutil(或 Windows)的限制
是否有“软”符号链接和连接的等价物?
也可以在 Windows10 系统上工作。
b
bviktor

新符号链接:

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"

Windows 10 用户看到 stackoverflow.com/a/34905638/195755 。 Windows 10 它 内置的。复制/粘贴:New-Item -Type 并按 Tab 循环浏览选项。 HardlinkSymbolicLinkJunction 为我显示。适用于 Win 10、Server 2016+ 或更旧的操作系统,通过 Windows Management Framework 5.0+ 安装了 Powershell 5.0。
或者如果文件名包含它们。
C
Community

试试 junction.exe

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

进一步阅读

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


正确使用此实用程序允许我连接另一个目录并成功遍历它的子目录。全部在 XP 和 W2K3 中。只需将 exe 添加到 PATH 中的目录并像往常一样调用它。
我认为您不能使用 junction.exe 创建符号链接。
最好使用 Windows 附带的 mklink如果您有一个随附的 Windows 版本。
P
Peter Mortensen

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

P
Peter Mortensen

您可以使用此实用程序:

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

不过,这将需要提升的特权。创建硬链接通常不会。
j
joshuapoehls

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

包括以下功能:

新符号链接

新硬链接

新结

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


P
Peter Mortensen

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

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


S
Steven

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

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

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


这是一个不同问题的答案吗?