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. :)

Mike T.
źródło
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 .

Jason R. Coombs
źródło
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

Jocassid
źródło
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.
Keith Hill
źródło
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).

quigi
źródło
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"
Bviktor
źródło
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 .)
notandy
źródło
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
Cheeso
źródło
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.

joshuapoehls
źródło
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"""
    }
}
mhenry1384
źródło
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.

zaraz
źródło
-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.

Steven
źródło
5
Czy to odpowiedź na inne pytanie?
Allanrbo,