Создание жестких и мягких ссылок с помощью PowerShell - PullRequest
201 голосов
/ 21 мая 2009

Может ли PowerShell 1.0 создавать жесткие и программные ссылки, аналогичные разновидности Unix?

Если это не встроено, может кто-нибудь указать мне на сайт, на котором есть скрипт ps1, который имитирует это?

Это необходимая функция любой хорошей оболочки, ИМХО. :)

Ответы [ 11 ]

234 голосов
/ 05 апреля 2011

Вы можете вызвать mklink, предоставленный cmd, из PowerShell для создания символических ссылок:

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 .

219 голосов
/ 20 января 2016

Windows 10 (и Powershell 5.0 в целом) позволяет создавать символические ссылки с помощью командлета New-Item .

Использование:

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:

enter image description here

39 голосов
/ 21 мая 2009

Нет, он не встроен в PowerShell, а утилита mklink в Windows Vista / Windows 7 встроена непосредственно в cmd.exe. Вы можете использовать Расширения сообщества PowerShell (бесплатно). Есть несколько командлетов для точек повторного анализа различных типов:

  • New-HardLink
  • New-SymLink
  • New-Junction
  • Remove-ReparsePoint
  • и др.
23 голосов
/ 10 апреля 2012

В Windows 7 команда

fsutil hardlink create new-file existing-file

PowerShell находит его без полного пути (c: \ Windows \ system32) или расширения (.exe).

15 голосов
/ 24 октября 2013

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"
}

Использование:

New-Symlink "c:\foo\bar" "c:\foo\baz"
Remove-Symlink "c:\foo\bar"
10 голосов
/ 22 мая 2009

Утилита командной строки Junction от Sysinternals позволяет легко создавать и удалять символические (мягкие) ссылки. Жесткие ссылки и соединения в Windows.

5 голосов
/ 22 мая 2009

Вы можете использовать эту утилиту:

c:\Windows\system32\fsutil.exe create hardlink
3 голосов
/ 03 апреля 2017

Я объединил два ответа (@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"""
    }
}
3 голосов
/ 08 июня 2012

Я написал модуль PowerShell, который имеет встроенные оболочки для MKLINK. https://gist.github.com/2891103

Включает функции для:

  • New-Symlink
  • New-HardLink
  • New-Junction

Захватывает вывод MKLINK и выдает правильные ошибки PowerShell при необходимости.

1 голос
/ 29 апреля 2011

На самом деле, команда Sysinternals junction работает только с каталогами (не спрашивайте меня почему), поэтому не может жестко связывать файлы. Я бы выбрал cmd /c mklink для мягких ссылок (я не могу понять, почему он не поддерживается напрямую PowerShell) или fsutil для жестких ссылок.

Если вам это нужно для работы в Windows XP, я не знаю ничего, кроме Sysinternals junction, поэтому вы можете ограничиться каталогами.

...