Tworzenie twardych i miękkich łączy za pomocą PowerShell


226

Czy PowerShell 1.0 może tworzyć twarde i miękkie linki analogiczne do odmiany Unix?

Jeśli to nie jest wbudowane, czy ktoś może wskazać mi witrynę, która ma naśladujący to skrypt ps1?

Jest to niezbędna funkcja każdej dobrej powłoki, IMHO. :)


6
Użytkownicy systemu Windows 10 widzą stackoverflow.com/a/34905638/195755 . Windows 10 jest wbudowany. Kopiuj / Wklej: New-Item -Type i naciśnij klawisz Tab, aby przechodzić między opcjami. Hardlink, SymbolicLinki Junctionpojaw się dla mnie. Działa z systemem Windows 10, Server 2016+ lub starszym z Powershell 5.0+ zainstalowanym za pomocą Windows Management Framework 5.0+.
yzorg

2
Nie mogę znaleźć godnej dokumentacji MSDN / TechNet za New-Item -Type HardLinknie New-Item -Type SymbolicLink. Dokumenty nowego elementu zawierają link do help about_Providers, sugeruje przeczytanie pomocy dla każdego dostawcy (który nie jest powiązany). Ale jeśli google go to, wokół społeczności PowerShell jest dużo szumu New-Item -Type HardLink. Wygląda na to, że zespół inżynierów PowerShell wymyślił punkty rozszerzeń dostawcy, które stumpują zespół docs.
yzorg

Odpowiedzi:


253

Możesz wywołać mklinkpodany przez cmd, z PowerShell, aby utworzyć dowiązania symboliczne:

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

Musisz przejść /ddo, mklinkjeśli celem jest katalog.

cmd /c mklink /d c:\path\to\symlink c:\target\directory

W przypadku twardych linków sugeruję coś w rodzaju Sysinternals Junction .


29
Jeśli masz profil PowerShell, możesz także wykonać szybką funkcjęfunction mklink { cmd /c mklink $args }
Joe Young,

14
a jeśli chcesz utworzyć link do katalogu, polecenie będzie wyglądać jak {cmd / c mklink / D "toDir" fromDir}
DavidDraughn

9
dodanie parametru / H do mklink spowoduje utworzenie twardego łącza bez potrzeby stosowania programu innej firmy, takiego jak Sysinternals Junction.
Fopedush,

3
Myślę, że jocassid ma lepszą odpowiedź. IMHO, Powinniśmy spróbować nauczyć się KORZYSTAĆ z programu PowerShell, a nie używać exploitów i hacków za pomocą cmd.exe.
Cameron Oakenleaf,

2
@SergeVoloshenko Z pewnością tak . To prawda, że ​​użycie New-Item wykrywa, czy cel jest katalogiem , ale New-Item zawiedzie, jeśli cel nie istnieje, podczas gdy mklink utworzy łącze symboliczne niezależnie .
Jason R. Coombs

266

Windows 10 (i ogólnie Powershell 5.0) umożliwia tworzenie dowiązań symbolicznych za pomocą polecenia cmdlet New-Item .

Stosowanie:

New-Item -Path C:\LinkDir -ItemType SymbolicLink -Value F:\RealDir

Lub w swoim profilu:

function make-link ($target, $link) {
    New-Item -Path $link -ItemType SymbolicLink -Value $target
}

Włącz tryb programisty, aby nie wymagać uprawnień administratora podczas tworzenia łączy z New-Item:

wprowadź opis zdjęcia tutaj


2
To łącze jest teraz zerwane z powodu zmiany dokumentacji MS. Znalazłem bieżący działający link na technet.microsoft.com/en-us/library/hh849795.aspx
Aaron Thomas

3
New-Item -Path C: \ LinkDir -ItemType SymbolicLink -Value F: \ RealDir
Daniel Fisher lennybacon

7
od Windows v1703 mklink pozwala na tworzenie dowiązań symbolicznych bez podniesienia konta, jeśli tryb programisty jest włączony w Ustawieniach, nowy element nie. Mam nadzieję, że w następnej aktualizacji.
papo

Fascynujący. Jest to więc całkiem odmienne od .lnkskrótu Eksploratora . W Eksploratorze skrót i dowiązanie symboliczne o tej samej nazwie są wyświetlane obok siebie, jakby nic nie było nie tak. Ich zachowania są subtelnie różne; podążanie za dowiązaniem symbolicznym pokazuje bezwzględną ścieżkę na pasku Eksploratora. Następujący skrót traktuje go tak, jakby katalog macierzysty dowiązania symbolicznego był prawdziwym rodzicem.
BaseZen

1
Przy przyjętej odpowiedzi mogłem używać ścieżek względnych, co nie było w przypadku New-Itemkomendy.
Dave F

41

Dodaj moduł „pscx”

Nie, nie jest wbudowany w PowerShell. A mklinknarzędzie nie może być wywoływane samo w systemie Windows Vista / Windows 7, ponieważ jest wbudowane bezpośrednio cmd.exejako „polecenie wewnętrzne” .

Możesz użyć rozszerzeń społeczności PowerShell (bezpłatnie). Istnieje kilka poleceń cmdlet dla punktów ponownej analizy różnych typów:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • i inni.

1
Dobra próba. Chociaż jeśli chcesz uruchomić serwer XP lub W2K3 na x32 lub x64, New-Symlink nie działa. W XP powie grzecznie, że powinieneś uruchomić Vistę dla tego polecenia. W serwerze W2K3 wyłapuje przerwy.
Mike T

To dlatego, że XP nie obsługuje dowiązań symbolicznych. To nowa funkcja w systemie Vista. Uważam, że serwer W2K3 również nie obsługuje dowiązań symbolicznych. Musisz wejść na serwer W2K8, aby uzyskać obsługę dowiązań symbolicznych. Zastanowię się, dlaczego new-symlink bombarduje W2k3, powinien zawierać błąd podobny do XP.
Keith Hill

Próbowałem nowego skrzyżowania i to będzie dla mnie działać. Szkoda, że ​​funkcjonalność łącza nie ogranicza się do skrzyżowań w XP i W2K3
Mike T

przy dalszym użyciu new-junction ... Dostaję skrzyżowanie z nowym punktem analizy. Jednak błędy ls (lub get-childitem) stwierdzające, że .. „Nazwa pliku, nazwa katalogu lub składnia etykiety woluminu jest niepoprawna” Jeśli spróbuję wprowadzić z niego podkatalog.
Mike T

2
Użytkownicy systemu Windows 10 widzą odpowiedź stackoverflow.com/a/34905638/195755 . Windows 10 jest wbudowany. Kopiuj / Wklej: New-Item -Type i naciśnij klawisz Tab, aby przechodzić między opcjami. Hardlink, SymbolicLinki Junctionpojaw się dla mnie. Działa z systemem Windows 10, Server 2016+ lub starszym z Powershell 5.0 zainstalowanym za pomocą Windows Management Framework 5.0+.
yzorg

23

W systemie Windows 7 polecenie to

fsutil hardlink create new-file existing-file

Program PowerShell znajduje go bez pełnej ścieżki (c: \ Windows \ system32) lub rozszerzenia (.exe).


1
fsutil hardlinkwymaga new-filei existing-filebyć na tym samym dysku. Jeśli to dla Ciebie ważne, użyj mklink /czamiast tego poleceń cmd .
mopsled

9
@mopsled Hardlinks z definicji musi znajdować się na tym samym wolumenie co element docelowy, nie jest to ograniczenie specyficzne dla fsutil(lub Windows w tym przypadku)
Dev

czy istnieje odpowiednik „miękkich” dowiązań symbolicznych i skrzyżowań?
jshall

Pracował również w systemie Windows10.
FooF

15

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

Usuń symlink:

Function Remove-SymLink ($link)
{
    if (test-path -pathtype container $link)
    {
        $command = "cmd /c rmdir"
    }
    else
    {
        $command = "cmd /c del"
    }

    invoke-expression "$command $link"
}

Stosowanie:

New-Symlink "c:\foo\bar" "c:\foo\baz"
Remove-Symlink "c:\foo\bar"

2
Użytkownicy systemu Windows 10 widzą stackoverflow.com/a/34905638/195755 . Windows 10 jest wbudowany. Kopiuj / Wklej: New-Item -Type i naciśnij klawisz Tab, aby przechodzić między opcjami. Hardlink, SymbolicLinki Junctionpojaw się dla mnie. Działa z systemem Windows 10, Server 2016+ lub starszym z Powershell 5.0 zainstalowanym za pomocą Windows Management Framework 5.0+.
yzorg

Lub jeśli nazwa pliku je zawiera.
Chris Charabaruk

10

Spróbuj junction.exe

Narzędzie wiersza poleceń Junction od SysInternals ułatwia tworzenie i usuwanie skrzyżowań.

Dalsza lektura

  • Terminologia MS: soft! = Symboliczny
    Microsoft używa „soft link” jako innej nazwy „skrzyżowania” .
    Jednak: „dowiązanie symboliczne” to coś zupełnie innego.
    Zobacz MSDN: Twarde łącza i połączenia w systemie Windows.
    (Jest to sprzeczne z ogólnym użyciem terminów, w których „miękki link” i „symboliczny link” ( „symboliczny link” ) oznaczają to samo .)

Prawidłowe użycie tego narzędzia pozwala mi połączyć inny katalog i pomyślnie przejść do jego podkatalogów. Wszystko w XP i W2K3. Po prostu dodaj plik exe do katalogu w PATH i nazwij go normalnie.
Mike T

Nie sądzę, że można użyć pliku junction.exe do tworzenia dowiązań symbolicznych.
Jason R. Coombs

3
Lepiej jest używać, mklinkktóry jest dostarczany z systemem Windows. Jeśli masz wersję systemu Windows, z którą jest dostarczana.
Usunięte

5

Możesz użyć tego narzędzia:

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

1
Będzie to jednak wymagało podwyższonych uprawnień. Tworzenie twardych linków zwykle nie.
Joey

3

Napisałem moduł PowerShell, który ma natywne opakowania dla MKLINK. https://gist.github.com/2891103

Zawiera funkcje dla:

  • Nowy symlink
  • New-HardLink
  • New-Junction

Przechwytuje dane wyjściowe MKLINK i w razie potrzeby generuje odpowiednie błędy programu PowerShell.


3

Połączyłem dwie odpowiedzi (@bviktor i @jocassid). Został przetestowany na Windows 10 i 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

W rzeczywistości polecenie Sysinternals junction działa tylko z katalogami (nie pytaj mnie dlaczego), więc nie może dowiązać plików. Wybrałbym cmd /c mklinkmiękkie linki (nie mogę zrozumieć, dlaczego nie jest obsługiwane bezpośrednio przez PowerShell) lub twarde linki fsutil.

Jeśli potrzebujesz go do pracy w systemie Windows XP, nie znam nic poza Sysinternals junction, więc możesz być ograniczony do katalogów.


-1

Znalazłem to w prosty sposób bez pomocy z zewnątrz. Tak, używa archaicznego polecenia DOS, ale działa, jest łatwe i jasne.

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

Korzysta z polecenia DOS dir, aby znaleźć wszystkie wpisy z atrybutem dowiązania symbolicznego, filtruje konkretną nazwę dowiązania, a następnie nawiasy docelowe „[]” i dla każdego - przypuszczalnie jednego - wyodrębnia tylko ciąg docelowy.


5
Czy to odpowiedź na inne pytanie?
Allanrbo,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.