Erstellen von Hard- und Softlinks mit PowerShell


226

Kann PowerShell 1.0 analog zur Unix-Variante Hard- und Softlinks erstellen?

Wenn dies nicht eingebaut ist, kann mich jemand auf eine Site verweisen, die ein ps1-Skript hat, das dies nachahmt?

Dies ist eine notwendige Funktion jeder guten Shell, IMHO. :) :)


6
Windows 10-Benutzer finden unter stackoverflow.com/a/34905638/195755 . Windows 10 ist eingebaut. Kopieren / Einfügen: New-Item -Type und drücken Sie die Tabulatortaste, um durch die Optionen zu blättern. Hardlink, SymbolicLinkUnd Junctionfür mich erscheinen. Funktioniert mit Win 10, Server 2016+ oder einem älteren Betriebssystem mit Powershell 5.0+, das über Windows Management Framework 5.0+ installiert wurde.
Yzorg

2
Ich kann keine anständige MSDN / TechNet-Dokumentation für New-Item -Type HardLinknoch finden New-Item -Type SymbolicLink. Der Link zu New-Item-Dokumenten help about_Providersweist darauf hin, dass Sie die Hilfe für jeden Anbieter lesen (der nicht verlinkt ist). Aber wenn Sie es googeln, gibt es in der PowerShell-Community viel Aufsehen New-Item -Type HardLink. Es sieht so aus, als hätte das PowerShell-Entwicklungsteam Anbietererweiterungspunkte entwickelt , die das Dokumententeam überraschen.
Yzorg

Antworten:


253

Sie können das mklinkvon cmd, von PowerShell bereitgestellte aufrufen , um symbolische Links herzustellen:

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

Sie müssen übergeben /d, mklinkwenn das Ziel ein Verzeichnis ist.

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

Für harte Links schlage ich so etwas wie Sysinternals Junction vor .


29
Wenn Sie ein Powershell-Profil haben, können Sie auch eine schnelle Funktion ausführenfunction mklink { cmd /c mklink $args }
Joe Young

14
und wenn Sie eine Verzeichnisverknüpfung herstellen möchten, lautet der Befehl ungefähr {cmd / c mklink / D "toDir" fromDir}
DavidDraughn

9
Durch Hinzufügen des Parameters / H zu mklink wird eine feste Verbindung erstellt, ohne dass ein Programm eines Drittanbieters wie Sysinternals Junction erforderlich ist.
Fopedush

3
Ich denke, Jocassid hat die bessere Antwort. IMHO, wir sollten versuchen zu lehren, wie man PowerShell benutzt, und keine Exploits und Hacks über cmd.exe verwenden.
Cameron Oakenleaf


266

Mit Windows 10 (und Powershell 5.0 im Allgemeinen) können Sie symbolische Links über das Cmdlet "Neues Element" erstellen .

Verwendung:

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

Oder in deinem Profil:

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

Aktivieren Sie den Entwicklermodus, um keine Administratorrechte zu benötigen, wenn Sie Links erstellen mit New-Item:

Geben Sie hier die Bildbeschreibung ein


2
Dieser Link ist jetzt aufgrund der MS-Neuordnung der Dokumentation unterbrochen. Ich fand einen aktuellen Arbeitslink unter technet.microsoft.com/en-us/library/hh849795.aspx
Aaron Thomas

3
New-Item -Path C: \ LinkDir -ItemType SymbolicLink -Wert F: \ RealDir
Daniel Fisher Lennybacon

7
Seit Windows v1703 ermöglicht mklink das Erstellen von Symlinks ohne Kontoerhöhung. Wenn der Entwicklermodus in den Einstellungen aktiviert ist, funktioniert New-Item nicht. Hoffentlich im nächsten Update.
Papo

Faszinierend. Dies unterscheidet sich also deutlich von einer Explorer- .lnkVerknüpfung. Im Explorer werden eine Verknüpfung und ein gleichnamiger Symlink nebeneinander angezeigt, als wäre nichts verkehrt. Ihr Verhalten ist subtil unterschiedlich; Wenn Sie dem Symlink folgen, wird der absolute Pfad in der Explorer-Leiste angezeigt. Wenn Sie der Verknüpfung folgen, wird sie so behandelt, als ob das übergeordnete Symlink-Verzeichnis das wahre übergeordnete Verzeichnis ist.
BaseZen

1
Mit der akzeptierten Antwort konnte ich relative Pfade verwenden, was beim New-ItemCommandlet nicht der Fall war .
Dave F

41

Fügen Sie das Modul "pscx" hinzu

Nein, es ist nicht in PowerShell integriert. Und das mklinkDienstprogramm kann unter Windows Vista / Windows 7 nicht alleine aufgerufen werden, da es direkt cmd.exeals "interner Befehl" integriert ist .

Sie können die PowerShell-Community-Erweiterungen (kostenlos) verwenden. Es gibt mehrere Cmdlets für Analysepunkte verschiedener Typen:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • und andere.

1
Guter Versuch. Wenn Sie einen XP- oder W2K3-Server in x32 oder x64 ausführen möchten, funktioniert New-Symlink nicht. In XP wird Ihnen höflich gesagt, dass Sie Vista für diesen Befehl ausführen sollten. Auf dem W2K3-Server kommt es zu Unterbrechungen.
Mike T

Das liegt daran, dass XP keine Symlinks unterstützt. Das ist eine neue Funktion in Vista. Ich glaube, dass der W2K3-Server auch keine Symlinks unterstützt. Sie müssen auf den W2K8-Server umsteigen, um Symlink-Unterstützung zu erhalten. Ich werde untersuchen, warum new-symlink auf W2k3 bombardiert. Es sollte ein Fehler mit einer ähnlichen Meldung wie bei XP auftreten.
Keith Hill

Ich habe New-Junction ausprobiert und das wird für mich funktionieren. Schade, dass sich die Link-Funktionalität nicht auf Junctions in XP und W2K3 verschlechtert
Mike T

bei weiterer Verwendung von new-junction ... Ich erhalte eine Kreuzung zum neuen Analysepunkt. Allerdings ls (oder get-childitem) Fehler, die besagen, dass .. "Die Syntax von Dateiname, Verzeichnisname oder Datenträgerbezeichnung ist falsch" Wenn ich versuche, von dort aus ein Unterverzeichnis einzugeben.
Mike T

2
Windows 10-Benutzer sehen die Antwort stackoverflow.com/a/34905638/195755 . Windows 10 ist eingebaut. Kopieren / Einfügen: New-Item -Type und drücken Sie die Tabulatortaste, um durch die Optionen zu blättern. Hardlink, SymbolicLinkUnd Junctionfür mich erscheinen. Funktioniert unter Win 10, Server 2016+ oder einem älteren Betriebssystem mit Powershell 5.0, das über Windows Management Framework 5.0+ installiert wurde.
Yzorg

23

In Windows 7 lautet der Befehl

fsutil hardlink create new-file existing-file

PowerShell findet es ohne den vollständigen Pfad (c: \ Windows \ system32) oder die Erweiterung (.exe).


1
fsutil hardlinkerfordert new-fileund existing-fileauf dem gleichen Laufwerk sein. Wenn Ihnen das wichtig ist, verwenden Sie mklink /cstattdessen cmds .
Mopsled

9
@mopsled Hardlinks müssen sich per Definition auf demselben Volume wie das Ziel befinden. Dies ist keine spezifische Einschränkung für fsutil(oder Windows)
Dev

Gibt es ein Äquivalent für "weiche" Symlinks und Junctions?
Jshall

Funktionierte auch auf einem Windows10-System.
FooF

15

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

Verwendung:

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

2
Windows 10-Benutzer finden unter stackoverflow.com/a/34905638/195755 . Windows 10 ist eingebaut. Kopieren / Einfügen: New-Item -Type und drücken Sie die Tabulatortaste, um durch die Optionen zu blättern. Hardlink, SymbolicLinkUnd Junctionfür mich erscheinen. Funktioniert unter Win 10, Server 2016+ oder einem älteren Betriebssystem mit Powershell 5.0, das über Windows Management Framework 5.0+ installiert wurde.
Yzorg

Oder wenn der Dateiname sie enthält.
Chris Charabaruk

10

Versuchen Sie junction.exe

Das Junction- Befehlszeilenprogramm von SysInternals erleichtert das Erstellen und Löschen von Junctions.

Weiterführende Literatur

  • MS-Terminologie: soft! = Symbolisch
    Microsoft verwendet "soft link" als anderen Namen für "junction" .
    Allerdings: Eine "symbolische Verbindung" ist etwas ganz anderes.
    Siehe MSDN: Hard Links und Junctions in Windows.
    (Dies steht in direktem Widerspruch zur allgemeinen Verwendung der Begriffe, bei denen "Softlink" und "Symbolischer Link" ( "Symlink" ) dasselbe bedeuten .)

Die korrekte Verwendung dieses Dienstprogramms ermöglicht es mir, ein anderes Verzeichnis zu verbinden und seine Unterverzeichnisse erfolgreich zu durchlaufen. Alles in XP und W2K3. Fügen Sie die Exe einfach einem Verzeichnis in Ihrem PATH hinzu und rufen Sie sie wie gewohnt auf.
Mike T

Ich glaube nicht, dass Sie junction.exe verwenden können, um symbolische Links zu erstellen.
Jason R. Coombs

3
Es ist besser zu verwenden, mklinkwas mit Windows geliefert wird. Wenn Sie eine Windows-Version haben, mit der es geliefert wird.
Gelöscht

5

Sie können dieses Dienstprogramm verwenden:

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

1
Es werden jedoch erhöhte Berechtigungen erforderlich sein. Das Erstellen von Hardlinks funktioniert normalerweise nicht.
Joey

3

Ich habe ein PowerShell-Modul geschrieben, das native Wrapper für MKLINK enthält. https://gist.github.com/2891103

Enthält Funktionen für:

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

Erfasst die MKLINK-Ausgabe und löst bei Bedarf die richtigen PowerShell-Fehler aus.


3

Ich habe zwei Antworten kombiniert (@bviktor und @jocassid). Es wurde unter Windows 10 und Windows Server 2012 getestet.

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

Tatsächlich funktioniert der Befehl Sysinternals junction nur mit Verzeichnissen (fragen Sie mich nicht warum), sodass Dateien nicht fest verknüpft werden können. Ich würde mich cmd /c mklinkfür Softlinks (ich kann mir nicht vorstellen, warum es nicht direkt von PowerShell unterstützt wird) oder fsutilfür Hardlinks entscheiden.

Wenn Sie es für Windows XP benötigen, ist mir nichts anderes als Sysinternals bekannt junction, sodass Sie möglicherweise auf Verzeichnisse beschränkt sind.


-1

Ich fand das auf einfache Weise ohne externe Hilfe. Ja, es verwendet einen archaischen DOS-Befehl, aber es funktioniert, es ist einfach und es ist klar.

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

Dies verwendet den Befehl DOS dir, um alle Einträge mit dem symbolischen Verknüpfungsattribut zu finden, nach dem spezifischen Verknüpfungsnamen zu filtern, gefolgt von Zielklammern "[]", und für jede - vermutlich eine - nur die Zielzeichenfolge zu extrahieren.


5
Ist das eine Antwort auf eine andere Frage?
Allanrbo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.