PowerShell 1.0可以创建类似于Unix的硬链接和软链接吗?
如果没有内置,有人可以指向我的网站,其中有一个模仿此内容的ps1脚本吗?
这是任何好壳的必要功能,恕我直言。 :)
答案 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
建立链接时不需要管理员权限:
答案 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命令查找具有符号链接属性的所有条目,在特定链接名称后面跟上目标“[]”括号,对于每个 - 大概是一个 - 只提取目标字符串。