Создание жестких и мягких ссылок с помощью PowerShell


226

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

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

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


6
Пользователи Windows 10 видят stackoverflow.com/a/34905638/195755 . Окна 10 он имеет встроенный. Копировать / Вставить: New-Item -Type и нажмите вкладку, чтобы просмотреть опции. Hardlink, SymbolicLinkИ Junctionпоявляются для меня. Работает Win 10, Server 2016+ или более старая ОС с Powershell 5.0+, установленным через Windows Management Framework 5.0+.
Ёзорг

2
Я не могу найти приличную документацию MSDN / TechNet для New-Item -Type HardLinkни New-Item -Type SymbolicLink. Ссылка на документацию с новым элементом help about_Providersпредлагает вам прочитать справку для каждого провайдера (который не связан). Но если вы воспользуетесь Google, в сообществе PowerShell будет много шума New-Item -Type HardLink. Похоже, что команда разработчиков PowerShell придумала точки расширения поставщика, которые ставят в тупик команду разработчиков документации.
Ёзорг

Ответы:


253

Вы можете позвонить из 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 .


29
Если у вас есть профиль PowerShell, вы также можете сделать быструю функциюfunction mklink { cmd /c mklink $args }
Джо Янг

14
и если вы хотите создать ссылку на каталог, команда будет выглядеть примерно так: {cmd / c mklink / D "toDir" fromDir}
DavidDraughn

9
добавление параметра / H в mklink создаст жесткую ссылку без необходимости использования сторонней программы, такой как Sysinternals Junction.
Фопедуш

3
Я думаю, у jocassid есть лучший ответ. ИМХО, мы должны попытаться научить использовать PowerShell, а не использовать эксплойты и хаки через cmd.exe.
Кэмерон Оукенлиф


266

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:

введите описание изображения здесь


2
Эта ссылка теперь не работает из-за перестановки документации MS. Я нашел текущую рабочую ссылку на technet.microsoft.com/en-us/library/hh849795.aspx
Аарон Томас

3
New-Item -Path C: \ LinkDir -ItemType SymbolicLink -Value F: \ RealDir
Даниэль Фишер lennybacon

7
начиная с Windows v1703, mklink позволяет создавать символические ссылки без повышения уровня учетной записи, если в настройках включен режим разработчика, то New-Item этого не делает. Надеюсь, в следующем обновлении.
Папа

Захватывающий. Так что это совершенно не похоже на .lnkярлык Explorer . В проводнике ярлык и символическая ссылка с тем же именем отображаются рядом, как будто ничего не случилось. Их поведение слегка отличается; следующая символическая ссылка показывает абсолютный путь в панели проводника. После сочетания клавиш он обрабатывается так, как будто родительский каталог символической ссылки является истинным родителем.
BaseZen

1
С принятым ответом я смог использовать относительные пути, чего не было в случае с New-Itemкомандлетом.
Дейв Ф

41

Добавить модуль "pscx"

Нет, он не встроен в PowerShell. И mklinkутилита не может быть вызвана сама по себе в Windows Vista / Windows 7, потому что она встроена непосредственно cmd.exeкак «внутренняя команда» .

Вы можете использовать PowerShell Community Extensions (бесплатно). Существует несколько командлетов для точек повторного анализа различных типов:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • и другие.

1
Хорошая попытка. Хотя, если вы хотите запустить сервер XP или W2K3 в x32 или x64, New-Symlink не будет работать. В XP он вежливо скажет вам, что для этой команды вы должны запустить Vista. На сервере W2K3 он полностью разрушается.
Майк Т

Это потому, что XP не поддерживает символические ссылки. Это новая функция для Vista. Я считаю, что сервер W2K3 также не поддерживает символические ссылки. Вы должны перейти на сервер W2K8, чтобы получить поддержку символических ссылок. Я посмотрю, почему new-symlink бомбит на W2k3, должно появиться сообщение об ошибке, подобное XP.
Кит Хилл

Я пробовал новый переход, и это будет работать для меня. Жаль, что функциональность ссылок не ухудшается до переходов в XP и W2K3
Майк Т

при дальнейшем использовании new-junction ... я получаю переход к новой точке разбора. Однако ошибки ls (или get-childitem) указывают на то, что .. «Неверный синтаксис имени файла, имени каталога или метки тома» Если я попытаюсь ввести оттуда подкаталог.
Майк Т

2
Пользователи Windows 10 видят ответ stackoverflow.com/a/34905638/195755 . Окна 10 он имеет встроенный. Копировать / Вставить: New-Item -Type и нажмите вкладку, чтобы просмотреть опции. Hardlink, SymbolicLinkИ Junctionпоявляются для меня. Работает Win 10, Server 2016+ или более старая ОС с Powershell 5.0, установленным через Windows Management Framework 5.0+.
yzorg

23

В Windows 7 команда

fsutil hardlink create new-file existing-file

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


1
fsutil hardlinkтребуется new-fileи existing-fileнаходиться на одном диске. Если это важно для вас, используйте mklink /cвместо этого cmd .
мопед

9
Жесткие ссылки @mopsled по определению должны быть на том же томе, что и цель, это не является ограничением, специфичным для fsutil(или Windows в этом отношении)
Dev

Есть ли эквивалент для "мягких" символических ссылок и соединений?
jshall

Работал также в системе Windows10.
FooF

15

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"

2
Пользователи Windows 10 видят stackoverflow.com/a/34905638/195755 . Окна 10 он имеет встроенный. Копировать / Вставить: New-Item -Type и нажмите вкладку, чтобы просмотреть опции. Hardlink, SymbolicLinkИ Junctionпоявляются для меня. Работает Win 10, Server 2016+ или более старая ОС с Powershell 5.0, установленным через Windows Management Framework 5.0+.
Ёзорг

Или если имя файла содержит их.
Крис Чарабарук

10

Попробуйте junction.exe

Junction утилита командной строки из SysInternals позволяет создавать и легко удалять перекрестки.

дальнейшее чтение

  • Терминология MS: soft! = Symbolic
    Microsoft использует «soft link» в качестве другого названия для «junction» .
    Однако «символическая ссылка» - это нечто совершенно другое.
    См. MSDN: Жесткие ссылки и соединения в Windows.
    (Это находится в прямом противоречии с общим использованием тех терминов, где «мягкая ссылка» и «символическая ссылка» ( «символическая ссылка» ) действительно означают одно и то же .)

Использование этой утилиты правильно позволяет мне соединять другой каталог и успешно проходить его подкаталоги. Все в XP и W2K3. Просто добавьте exe-файл в каталог в вашей переменной PATH и назовите его как обычно.
Майк Т

Я не думаю, что вы можете использовать junction.exe для создания символических ссылок.
Джейсон Р. Кумбс

3
Лучше использовать, mklinkкоторый поставляется с Windows. Если у вас есть версия Windows, с которой она поставляется.
удалено

5

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

c:\Windows\system32\fsutil.exe create hardlink

1
Это потребует повышенных привилегий, хотя. Создавать жесткие ссылки обычно нет.
Джои

3

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

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

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

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


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

1

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

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


-1

Я нашел это простым способом без посторонней помощи. Да, он использует архаичную команду DOS, но работает, это легко и понятно.

$target = cmd /c dir /a:l | ? { $_ -match "mySymLink \[.*\]$" } | % `
{
    $_.Split([char[]] @( '[', ']' ), [StringSplitOptions]::RemoveEmptyEntries)[1]
}

При этом используется команда DOS dir, чтобы найти все записи с атрибутом символьной ссылки, фильтры для конкретного имени ссылки, за которым следуют целевые скобки «[]», и для каждой - предположительно, одной - извлекается только целевая строка.


5
Это ответ на другой вопрос?
Allanrbo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.