PowerShell 1.0 能否创建类似于 Unix 的硬链接和软链接?
如果这不是内置的,有人可以将我指向一个具有模仿此 ps1 脚本的站点吗?
这是任何好的外壳的必要功能,恕我直言。 :)
New-Item -Type
并按 Tab 循环浏览选项。 Hardlink
、SymbolicLink
和 Junction
为我显示。适用于 Win 10、Server 2016+ 或更早版本的操作系统,通过 Windows Management Framework 5.0+ 安装了 Powershell 5.0+。
New-Item -Type HardLink
和 New-Item -Type SymbolicLink
的 MSDN/TechNet 文档。新项目文档链接到 help about_Providers
,它建议您阅读每个提供者的帮助(未链接)。但是,如果您在 Google 上搜索它,就会在 PowerShell 社区中围绕 New-Item -Type HardLink
进行大量讨论。看起来 PowerShell 工程团队提出了 provider 扩展点,这些扩展点让 docs 团队望而却步。
WARNING!
-- 虽然创建硬链接 非常容易,但安全地删除它们可能是一个相当大的挑战。这是因为这些工具在本机 Powershell 中不容易使用,而 Windows 喜欢锁定文件访问并将文件保存在内存中(因此在不重新启动的情况下并不总是可以删除。)请参阅我的帖子 here。
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
您可以从 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。
function mklink { cmd /c mklink $args }
New-Item
does detect if the target is a directory,但 New-Item
will fail if the target does not exist 而 mklink will create the symbolic link regardless。
添加“pscx”模块
不,它没有内置在 PowerShell 中。并且 mklink
实用程序不能在 Windows Vista/Windows 7 上单独调用,因为它是 built directly into cmd.exe
as an "internal command"。
您可以使用 PowerShell Community Extensions(免费)。有几个 cmdlet 用于各种类型的重解析点:
新硬链接,
新符号链接,
新结,
删除-ReparsePoint
和别的。
New-Item -Type
并按 Tab 循环浏览选项。 Hardlink
、SymbolicLink
和 Junction
为我显示。适用于 Win 10、Server 2016+ 或更旧的操作系统,通过 Windows Management Framework 5.0+ 安装了 Powershell 5.0。
在 Windows 7 中,命令是
fsutil hardlink create new-file existing-file
PowerShell 在没有完整路径 (c:\Windows\system32) 或扩展名 (.exe) 的情况下找到它。
fsutil hardlink
要求 new-file
和 existing-file
位于同一驱动器上。如果这对您很重要,请改用 cmd 的 mklink /c
。
fsutil
(或 Windows)的限制
新符号链接:
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"
New-Item -Type
并按 Tab 循环浏览选项。 Hardlink
、SymbolicLink
和 Junction
为我显示。适用于 Win 10、Server 2016+ 或更旧的操作系统,通过 Windows Management Framework 5.0+ 安装了 Powershell 5.0。
试试 junction.exe
SysInternals 的 Junction 命令行实用程序使创建和删除联结变得容易。
进一步阅读
MS 术语:soft != symbolic Microsoft 使用“软链接”作为“连接”的另一个名称。但是:“符号链接”完全是另外一回事。请参阅 MSDN:Windows 中的硬链接和连接。 (这与“软链接”和“符号链接”(“符号链接”)的含义相同的那些术语的一般用法直接矛盾。)
mklink
。 如果您有一个随附的 Windows 版本。
我结合了两个答案(@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"""
}
}
您可以使用此实用程序:
c:\Windows\system32\fsutil.exe create hardlink
我编写了一个 PowerShell 模块,该模块具有 MKLINK 的本机包装器。 https://gist.github.com/2891103
包括以下功能:
新符号链接
新硬链接
新结
捕获 MKLINK 输出并在必要时引发适当的 PowerShell 错误。
实际上,Sysinternals junction
命令只适用于目录(不要问我为什么),所以它不能硬链接文件。对于软链接,我会选择 cmd /c mklink
(我不明白为什么 PowerShell 不直接支持它),对于硬链接,我会选择 fsutil
。
如果您需要它在 Windows XP 上工作,我不知道除了 Sysinternals junction
之外的任何东西,因此您可能仅限于目录。
我发现这是没有外部帮助的简单方法。是的,它使用了一个古老的 DOS 命令,但它可以工作,很简单,而且很清楚。
$target = cmd /c dir /a:l | ? { $_ -match "mySymLink \[.*\]$" } | % `
{
$_.Split([char[]] @( '[', ']' ), [StringSplitOptions]::RemoveEmptyEntries)[1]
}
这使用 DOS dir 命令查找具有符号链接属性的所有条目,过滤特定链接名称后跟目标“[]”括号,并且对于每个(可能是一个)仅提取目标字符串。
不定期副业成功案例分享
New-Item
commandlet 则不然。HardLink
的-ItemType
,对目录使用Junction
。这些不需要开发人员模式或管理员权限。