PowerShell 1.0 能否创建类似于 Unix 的硬链接和软链接?
如果这不是内置的,有人可以将我指向一个具有模仿此 ps1 脚本的站点吗?
这是任何好的外壳的必要功能,恕我直言。:)
PowerShell 1.0 能否创建类似于 Unix 的硬链接和软链接?
如果这不是内置的,有人可以将我指向一个具有模仿此 ps1 脚本的站点吗?
这是任何好的外壳的必要功能,恕我直言。:)
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
:
您可以从 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 之类的东西。
不,它没有内置在 PowerShell 中。并且该mklink
实用程序不能在 Windows Vista/Windows 7 上单独调用,因为它是作为“内部命令”直接cmd.exe
内置的。
您可以使用PowerShell 社区扩展(免费)。有几个 cmdlet 用于各种类型的重解析点:
New-HardLink
,New-SymLink
,New-Junction
,Remove-ReparsePoint
在 Windows 7 中,命令是
fsutil hardlink create new-file existing-file
PowerShell 在没有完整路径 (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"
您可以使用此实用程序:
c:\Windows\system32\fsutil.exe create hardlink
我结合了两个答案(@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"""
}
}
我编写了一个 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 命令查找具有符号链接属性的所有条目,过滤特定链接名称后跟目标“[]”括号,并且对于每个(可能是一个)仅提取目标字符串。