Creazione di collegamenti hard e soft tramite PowerShell


226

PowerShell 1.0 può creare collegamenti rigidi e analoghi alla varietà Unix?

Se questo non è integrato, qualcuno può indicarmi un sito che ha uno script ps1 che lo imita?

Questa è una funzione necessaria per qualsiasi buona shell, IMHO. :)


6
Gli utenti di Windows 10 vedono stackoverflow.com/a/34905638/195755 . Windows 10 è integrato. Copia / Incolla: New-Item -Type e premere tab per scorrere tra le opzioni. Hardlink, SymbolicLinke Junctionapparire per me. Funziona con Windows 10, Server 2016+ o SO precedente con Powershell 5.0+ installato tramite Windows Management Framework 5.0+.
— yzorg,

2
Non riesco a trovare una buona documentazione MSDN / TechNet per New-Item -Type HardLinkné New-Item -Type SymbolicLink. I documenti di New-Item si collegano a help about_Providers, ti suggerisce di leggere la guida per ciascun provider (che non è collegato). Ma se vai su Google c'è un sacco di buzz nella comunità di PowerShell in giro New-Item -Type HardLink. Sembra che il team di progettazione di PowerShell abbia escogitato punti di estensione del provider che ostacolano il team di documentazione.
— yzorg,

Risposte:


253

È possibile chiamare il mklinkfornito da cmd, da PowerShell per creare collegamenti simbolici:

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

È necessario passare /da mklinkse la destinazione è una directory.

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

Per i collegamenti reali, suggerisco qualcosa come Sysinternals Junction .


29
Se hai un profilo PowerShell, puoi anche fare una funzione velocefunction mklink { cmd /c mklink $args }
— Joe Young,

14
e se si desidera creare un collegamento alla directory, il comando sarà simile a {cmd / c mklink / D "toDir" fromDir}
— DavidDraughn

9
l'aggiunta del parametro / H a mklink creerà un collegamento reale senza la necessità di un programma di terze parti come Sysinternals Junction.
— Fopedush,

3
Penso che Jocassid abbia la risposta migliore. IMHO, dovremmo provare a insegnare come USARE PowerShell, non usare exploit e hack tramite cmd.exe.
— Cameron Oakenleaf,


266

Windows 10 (e Powershell 5.0 in generale) consente di creare collegamenti simbolici tramite il cmdlet New-Item .

Uso:

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

O nel tuo profilo:

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

Attiva la Modalità sviluppatore per non richiedere i privilegi di amministratore quando crei collegamenti con New-Item:

inserisci qui la descrizione dell'immagine


2
Questo collegamento è ora interrotto a causa della riorganizzazione della documentazione di MS. Ho trovato un link funzionante su 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
a partire da Windows v1703, mklink consente di creare collegamenti simbolici senza elevazione dell'account, se la modalità sviluppatore è abilitata in Impostazioni, New-Item no. Speriamo nel prossimo aggiornamento.
— papo,

Affascinante. Quindi questo è abbastanza distinto da un .lnkcollegamento Explorer . In explorer, una scorciatoia e un collegamento simbolico con lo stesso nome vengono visualizzati fianco a fianco come se nulla fosse sbagliato. I loro comportamenti sono leggermente diversi; seguendo il collegamento simbolico viene mostrato il percorso assoluto nella barra di Explorer. Seguire il collegamento lo considera come se la dir parent del link simbolico fosse il vero parent.
— BaseZen,

1
Con la risposta accettata , sono stato in grado di utilizzare percorsi relativi, il che non era il caso del New-Itemcomando.
— Dave F,

41

Aggiungi il modulo "pscx"

No, non è integrato in PowerShell. E l' mklinkutilità non può essere richiamata da sola su Windows Vista / Windows 7 perché è integrata direttamente cmd.execome "comando interno" .

È possibile utilizzare le estensioni della community di PowerShell (gratuitamente). Esistono diversi cmdlet per punti di analisi di vari tipi:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • e altri.

1
Bel tentativo. Tuttavia, se si desidera eseguire il server XP o W2K3 in x32 o x64, New-Symlink non funziona. In XP ti dirà cortesemente che dovresti eseguire Vista per questo comando. Nel server W2K3, si rompe completamente.
— Mike T,

Questo perché XP non supporta i collegamenti simbolici. Questa è una funzionalità nuova di Vista. Credo che il server W2K3 non supporti neanche i collegamenti simbolici. È necessario passare al server W2K8 per ottenere il supporto del collegamento simbolico. Vedrò perché new-symlink sta bombardando su W2k3, dovrebbe avere un messaggio simile a XP.
— Keith Hill,

Ho provato New-Junction e questo funzionerà per me. Peccato che la funzionalità di collegamento non degrada a giunzioni in XP e W2K3
— Mike T

su un ulteriore uso di new-junction ... Ottengo un incrocio con il nuovo punto di analisi. Tuttavia errori ls (o get-childitem) che affermano che .. "Il nome del file, il nome della directory o la sintassi dell'etichetta del volume non sono corretti" Se provo ad entrare in una sottodirectory da lì.
— Mike T,

2
Gli utenti di Windows 10 visualizzano la risposta stackoverflow.com/a/34905638/195755 . Windows 10 è integrato. Copia / Incolla: New-Item -Type e premere tab per scorrere tra le opzioni. Hardlink, SymbolicLinke Junctionapparire per me. Funziona con Windows 10, Server 2016+ o SO precedente con Powershell 5.0 installato tramite Windows Management Framework 5.0+.
— yzorg,

23

In Windows 7, il comando è

fsutil hardlink create new-file existing-file

PowerShell lo trova senza il percorso completo (c: \ Windows \ system32) o l'estensione (.exe).


1
fsutil hardlinkrichiede new-fileed existing-fileessere sulla stessa unità. Se questo è importante per te, usa mklink /cinvece cmd .
— bopsled il

9
@mopsled Hardlink, per definizione, deve trovarsi sullo stesso volume della destinazione, questa non è una limitazione specifica di fsutil(o Windows per quella materia)
— Dev

esiste un equivalente per symlink e incroci "soft"?
— jshall

Ha funzionato anche su un sistema 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"
}

Rimuovere-Symlink:

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

    invoke-expression "$command $link"
}

Uso:

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

2
Gli utenti di Windows 10 vedono stackoverflow.com/a/34905638/195755 . Windows 10 è integrato. Copia / Incolla: New-Item -Type e premere tab per scorrere tra le opzioni. Hardlink, SymbolicLinke Junctionapparire per me. Funziona con Windows 10, Server 2016+ o SO precedente con Powershell 5.0 installato tramite Windows Management Framework 5.0+.
— yzorg,

O se il nome del file li contiene.
— Chris Charabaruk,

10

Prova junction.exe

The Junction utilità della riga di comando di SysInternals semplifica la creazione e l'eliminazione di giunzioni.

Ulteriori letture

  • Terminologia MS: soft! = Simbolico
    Microsoft utilizza "soft link" come altro nome per "junction" .
    Tuttavia: un "collegamento simbolico" è completamente diverso.
    Vedi MSDN: Hard Link e incroci in Windows.
    (Ciò è in diretta contraddizione con l'uso generale di quei termini in cui "collegamento soft" e "collegamento simbolico" ( "link simbolico" ) significano la stessa cosa .)

L'uso corretto di questa utility mi consente di congiungere un'altra directory e attraversare con successo le sue sottodirectory. Tutto in XP e W2K3. Aggiungi exe a una directory nel tuo PERCORSO e chiamalo come al solito.
— Mike T,

Non penso che tu possa usare junction.exe per creare collegamenti simbolici.
— Jason R. Coombs,

3
È meglio usare quello mklinkfornito con Windows. Se hai una versione di Windows con cui viene spedita.
— Eliminato il

5

Puoi usare questa utility:

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

1
Richiederà privilegi elevati, tuttavia. La creazione di hardlink di solito no.
— Joey,

3

Ho scritto un modulo PowerShell con wrapper nativi per MKLINK. https://gist.github.com/2891103

Include funzioni per:

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

Cattura l'output MKLINK e genera gli errori PowerShell corretti quando necessario.


3

Ho combinato due risposte (@bviktor e @jocassid). È stato testato su Windows 10 e 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

In realtà, il comando Sysinternals junction funziona solo con le directory (non chiedetemi perché), quindi non può eseguire il hardlink dei file. Vorrei andare con i cmd /c mklinksoft link (non riesco a capire perché non sia supportato direttamente da PowerShell), ofsutil per i hardlink.

Se ne hai bisogno per funzionare su Windows XP, non so altro che Sysinternals junction, quindi potresti essere limitato alle directory.


-1

Ho trovato questo in modo semplice senza aiuto esterno. Sì, utilizza un comando DOS arcaico ma funziona, è facile ed è chiaro.

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

Questo utilizza il comando dir DOS per trovare tutte le voci con l'attributo simbolico del collegamento, i filtri sul nome specifico del collegamento seguito dalle parentesi "[]" di destinazione e per ognuna - presumibilmente una - estrae solo la stringa di destinazione.


5
È una risposta a una domanda diversa?
— Allanrbo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.