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 HardLinkNew-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.