Creating hard and soft links using PowerShell
Solution 1:
Windows 10 (and Powershell 5.0 in general) allows you to create symbolic links via the New-Item cmdlet.
Usage:
New-Item -Path C:\LinkDir -ItemType SymbolicLink -Value F:\RealDir
Or in your profile:
function make-link ($target, $link) {
New-Item -Path $link -ItemType SymbolicLink -Value $target
}
Turn on Developer Mode to not require admin privileges when making links with New-Item
:
Solution 2:
You can call the mklink
provided by cmd
, from PowerShell to make symbolic links:
cmd /c mklink c:\path\to\symlink c:\target\file
You must pass /d
to mklink
if the target is a directory.
cmd /c mklink /d c:\path\to\symlink c:\target\directory
For hard links, I suggest something like Sysinternals Junction.
Solution 3:
Add "pscx" module
No, it isn't built into PowerShell. And the mklink
utility cannot be called on its own on Windows Vista/Windows 7 because it is built directly into cmd.exe
as an "internal command".
You can use the PowerShell Community Extensions (free). There are several cmdlets for reparse points of various types:
-
New-HardLink
, -
New-SymLink
, -
New-Junction
, Remove-ReparsePoint
- and others.
Solution 4:
In Windows 7, the command is
fsutil hardlink create new-file existing-file
PowerShell finds it without the full path (c:\Windows\system32) or extension (.exe).
Solution 5:
New-Symlink:
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"
}
Remove-Symlink:
Function Remove-SymLink ($link)
{
if (test-path -pathtype container $link)
{
$command = "cmd /c rmdir"
}
else
{
$command = "cmd /c del"
}
invoke-expression "$command $link"
}
Usage:
New-Symlink "c:\foo\bar" "c:\foo\baz"
Remove-Symlink "c:\foo\bar"