Створення жорстких і м'яких посилань за допомогою 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+.
yzorg

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

Відповіді:


253

Ви можете зателефонувати mklinkнаданому компанією cmdPowerShell для символічних посилань:

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
Якщо у вас є профіль Powerhell, ви також можете зробити швидку функцію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
Новий предмет-Шлях C: \ LinkDir -ItemType SymbolicLink -Value F: \ RealDir
Daniel Fisher lennybacon

7
оскільки Windows v1703, mklink дозволяє створювати посилання без підключення облікового запису, якщо режим "Розробник" увімкнено в "Налаштуваннях", "Новий елемент" не працює. Сподіваємось, у наступному оновлення.
папо

Захоплююче. Тож це зовсім не відрізняється від .lnkярлика Explorer . У досліднику ярлик і символьне посилання з однойменним відображенням відображаються поряд, як ніби нічого не даремно. Їх поведінка тонко відрізняється; після символьної посилання показує абсолютний шлях на панелі Провідника. Слідом за цим ярликом трактується це так, як ніби батько dir символьного посилання є справжнім батьківським.
BaseZen

1
З прийнятою відповіддю я зміг використати відносні шляхи, що не було у випадку з New-Itemкомандлетом.
Дейв F

41

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

Ні, він не вбудований в PowerShell. І mklinkутиліту не можна викликати самостійно у Windows Vista / Windows 7, оскільки вона вбудована безпосередньо у cmd.exe"внутрішню команду" .

Ви можете використовувати розширення спільноти PowerShell (безкоштовно). Існує кілька командлетів для повторних точок різного типу:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • і інші.

1
Гарна спроба. Хоча, якщо ви хочете запустити сервер XP або W2K3 на x32 або x64, New-Symlink не працює. У XP він ввічливо скаже вам, що для цієї команди вам слід запустити Vista. На сервері W2K3 він вирівнює злам.
Майк Т

Це тому, що XP не підтримує символьні посилання. Це нова функція Vista. Я вважаю, що сервер W2K3 теж не підтримує посилання. Вам потрібно піднятися до сервера W2K8, щоб отримати підтримку symlink. Я розберуся, чому new-symlink бомбардує W2k3, він повинен помилитися з аналогічним повідомленням до XP.
Кіт Хілл

Я спробував new-junction і це допоможе мені. Дуже погано функціональність посилань не погіршується до стиків у 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+.
yzorg

Або якщо ім'я файлу містить їх.
Кріс Чарабарук

10

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

Junction утиліта командного рядка з SysInternals дозволяє створювати і легко видаляти перехрестя.

Подальше читання

  • MS Terminology: soft! = Символічний
    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]
}

Це використовує команду DIR dir для пошуку всіх записів із символічним атрибутом посилання, фільтрами по конкретному імені посилання з наступними дужками "[]", а для кожної - імовірно однієї - витягує лише цільовий рядок.


5
Це відповідь на інше питання?
Алланрбо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.