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



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



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



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

636   11  

11 ответов:

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

cmd /c mklink c:\path\to\symlink c:\target\file

вы должны пройти /d до mklink если целью является каталог.

для жестких ссылок, я предлагаю что-то вроде Sysinternals Junction.

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

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

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

в Windows 7, команда

fsutil hardlink create new-file existing-file

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

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

Удалить Символическую Ссылку:

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"

The Junction утилита командной строки от Sysinternals упрощает создание и удаление символических (мягких)ссылок. жесткие ссылки и соединения в Windows.

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

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

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

включает в себя функции для:

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

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

Я объединил два ответа (@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"""
    }
}

на самом деле Sysinternalsjunction команда работает только с каталогами (не спрашивайте меня, почему), поэтому она не может жестко связывать файлы. Я бы пошел с 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, чтобы найти все записи с атрибутом символьной ссылки, фильтры по конкретному имени ссылки, за которым следуют целевые скобки " []", и для каждого - предположительно одного - извлекает только целевую строку.

Comments

    Ничего не найдено.