Création de liens matériels et logiciels à l'aide de PowerShell

226

PowerShell 1.0 peut-il créer des liens durs et souples analogues à la variété Unix?

Si ce n'est pas intégré, quelqu'un peut-il me diriger vers un site qui a un script ps1 qui imite cela?

C'est une fonction nécessaire de tout bon shell, à mon humble avis. :)

Mike T
la source
6
Les utilisateurs de Windows 10 voient stackoverflow.com/a/34905638/195755 . Windows 10, il est intégré. Copier / Coller: New-Item -Type et appuyez sur tab pour parcourir les options. Hardlink, SymbolicLinket Junctionapparaissent pour moi. Works Win 10, Server 2016+ ou un système d'exploitation plus ancien avec Powershell 5.0+ installé via Windows Management Framework 5.0+.
yzorg
2
Je ne trouve pas de documentation MSDN / TechNet décente pour New-Item -Type HardLinkni New-Item -Type SymbolicLink. Les documents New-Item contiennent un lien vers help about_Providers, il vous suggère de lire l'aide pour chaque fournisseur (qui n'est pas lié). Mais si vous le recherchez sur Google, il y a beaucoup de buzz dans la communauté PowerShell New-Item -Type HardLink. Il semble que l'équipe d'ingénierie PowerShell ait trouvé des points d'extension de fournisseur qui déconcertent l'équipe de documentation.
yzorg

Réponses:

253

Vous pouvez appeler le mklinkfourni par cmd, à partir de PowerShell pour créer des liens symboliques:

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

Vous devez passer /dà mklinksi la cible est un répertoire.

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

Pour les liens durs, je suggère quelque chose comme Sysinternals Junction .

Jason R. Coombs
la source
29
Si vous avez un profil PowerShell, vous pouvez également faire une fonction rapidefunction mklink { cmd /c mklink $args }
Joe Young
14
et si vous voulez créer un lien de répertoire, la commande sera quelque chose comme {cmd / c mklink / D "toDir" fromDir}
DavidDraughn
9
l'ajout du paramètre / H à mklink créera un lien dur sans avoir besoin d'un programme tiers comme Sysinternals Junction.
Fopedush
3
Je pense que jocassid a la meilleure réponse. À mon humble avis, nous devons essayer d'enseigner comment utiliser PowerShell, pas utiliser les exploits et les hacks via cmd.exe.
Cameron Oakenleaf
2
@SergeVoloshenko C'est sûr . Certes, l'utilisation New-Item détecte si la cible est un répertoire , mais New-Item échouera si la cible n'existe pas, tandis que mklink créera le lien symbolique malgré tout .
Jason R. Coombs
266

Windows 10 (et Powershell 5.0 en général) vous permet de créer des liens symboliques via l'applet de commande New-Item .

Usage:

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

Ou dans votre profil:

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

Activez le mode développeur pour ne pas exiger de privilèges d'administrateur lors de l'établissement de liens avec New-Item:

entrez la description de l'image ici

jocassid
la source
2
Ce lien est maintenant rompu en raison de la réorganisation de la documentation de MS. J'ai trouvé un lien de travail actuel sur technet.microsoft.com/en-us/library/hh849795.aspx
Aaron Thomas
3
Nouvel élément -Path C: \ LinkDir -ItemType SymbolicLink -Value F: \ RealDir
Daniel Fisher lennybacon
7
depuis Windows v1703, mklink permet de créer des liens symboliques sans élévation de compte, si le mode développeur est activé dans Paramètres, New-Item ne le fait pas. Espérons que dans la prochaine mise à jour.
papo
Fascinant. C'est donc tout à fait différent d'un .lnkraccourci Explorer . Dans l'explorateur, un raccourci et un lien symbolique du même nom s'affichent côte à côte comme si de rien n'était. Leurs comportements sont subtilement différents; le lien symbolique suivant montre le chemin absolu dans la barre de l'explorateur. Le fait de suivre le raccourci le traite comme si le répertoire parent du lien symbolique était le vrai parent.
BaseZen
1
Avec la réponse acceptée , j'ai pu utiliser des chemins relatifs, ce qui n'était pas le cas avec la New-Itemcommande.
Dave F
41

Ajouter un module "pscx"

Non, il n'est pas intégré à PowerShell. Et l' mklinkutilitaire ne peut pas être appelé seul sous Windows Vista / Windows 7 car il est intégré directement en cmd.exetant que "commande interne" .

Vous pouvez utiliser les extensions de communauté PowerShell (gratuites). Il existe plusieurs applets de commande pour les points d'analyse de différents types:

  • New-HardLink,
  • New-SymLink,
  • New-Junction,
  • Remove-ReparsePoint
  • et d'autres.
Keith Hill
la source
1
Bon essai. Bien que si vous souhaitez exécuter le serveur XP ou W2K3 en x32 ou x64, New-Symlink ne fonctionne pas. Sous XP, il vous indiquera poliment que vous devez exécuter Vista pour cette commande. Dans le serveur W2K3, les ruptures sont planes.
Mike T
C'est parce que XP ne prend pas en charge les liens symboliques. C'est une fonctionnalité nouvelle pour Vista. Je crois que le serveur W2K3 ne prend pas non plus en charge les liens symboliques. Vous devez passer au serveur W2K8 pour obtenir la prise en charge du lien symbolique. J'examinerai pourquoi new-symlink bombarde sur W2k3, il devrait afficher une erreur avec un message similaire à XP.
Keith Hill,
J'ai essayé la nouvelle jonction et cela fonctionnera pour moi. Dommage que la fonctionnalité de lien ne se dégrade pas en jonctions sous XP et W2K3
Mike T
sur l'utilisation ultérieure de la nouvelle jonction ... J'obtiens une jonction vers le nouveau point d'analyse. Toutefois, des erreurs ls (ou get-childitem) indiquant que .. "Le nom de fichier, le nom de répertoire ou la syntaxe de l'étiquette de volume est incorrecte" Si j'essaie de saisir un sous-répertoire à partir de là.
Mike T
2
Les utilisateurs de Windows 10 voient la réponse stackoverflow.com/a/34905638/195755 . Windows 10, il est intégré. Copier / Coller: New-Item -Type et appuyez sur tab pour parcourir les options. Hardlink, SymbolicLinket Junctionapparaissent pour moi. Works Win 10, Server 2016+ ou un système d'exploitation plus ancien avec Powershell 5.0 installé via Windows Management Framework 5.0+.
yzorg
23

Sous Windows 7, la commande est

fsutil hardlink create new-file existing-file

PowerShell le trouve sans le chemin d'accès complet (c: \ Windows \ system32) ou l'extension (.exe).

quigi
la source
1
fsutil hardlinknécessite new-fileet existing-fileêtre sur le même lecteur. Si cela vous importe, utilisez mklink /cplutôt les cmd .
raté le
9
@mopsled Hardlinks, par définition, doit être sur le même volume que la cible, ce n'est pas une limitation spécifique à fsutil(ou à Windows d'ailleurs)
Dev
Existe-t-il un équivalent pour les liens symboliques et les jonctions "souples"?
jshall
Fonctionne également sur un système 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"
}

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

Usage:

New-Symlink "c:\foo\bar" "c:\foo\baz"
Remove-Symlink "c:\foo\bar"
bviktor
la source
2
Les utilisateurs de Windows 10 voient stackoverflow.com/a/34905638/195755 . Windows 10, il est intégré. Copier / Coller: New-Item -Type et appuyez sur tab pour parcourir les options. Hardlink, SymbolicLinket Junctionapparaissent pour moi. Works Win 10, Server 2016+ ou un système d'exploitation plus ancien avec Powershell 5.0 installé via Windows Management Framework 5.0+.
yzorg
Ou si le nom de fichier les contient.
Chris Charabaruk
10

Essayez junction.exe

L' utilitaire de ligne de commande Junction de SysInternals facilite la création et la suppression de jonctions.

Lectures complémentaires

  • Terminologie MS: soft! = Symbolique
    Microsoft utilise "soft link" comme autre nom pour "junction" .
    Cependant: un "lien symbolique" est tout autre chose.
    Voir MSDN: liens durs et jonctions dans Windows.
    (Ceci est en contradiction directe avec l'utilisation générale de ces termes où "lien souple" et "lien symbolique" ( "lien symbolique" ) signifient la même chose .)
notandy
la source
L'utilisation de cet utilitaire me permet de jonctionner correctement un autre répertoire et de traverser ses sous-répertoires avec succès. Tout en XP et W2K3. Ajoutez simplement l'exe à un répertoire de votre PATH et appelez-le comme d'habitude.
Mike T
Je ne pense pas que vous pouvez utiliser junction.exe pour créer des liens symboliques.
Jason R. Coombs
3
Il vaut mieux utiliser mklinkce qui est livré avec Windows. Si vous avez une version Windows avec laquelle elle est livrée.
Supprimé le
5

Vous pouvez utiliser cet utilitaire:

c:\Windows\system32\fsutil.exe create hardlink
Cheeso
la source
1
Cela nécessitera cependant des privilèges élevés. La création de liens physiques ne le fait généralement pas.
Joey
3

J'ai écrit un module PowerShell qui a des wrappers natifs pour MKLINK. https://gist.github.com/2891103

Comprend des fonctions pour:

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

Capture la sortie MKLINK et génère les erreurs PowerShell appropriées lorsque cela est nécessaire.

joshuapoehls
la source
3

J'ai combiné deux réponses (@bviktor et @jocassid). Il a été testé sur Windows 10 et 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
la source
1

En fait, la commande Sysinternals junction ne fonctionne qu'avec les répertoires (ne me demandez pas pourquoi), donc elle ne peut pas lier des fichiers en dur. J'irais avec cmd /c mklinkpour les liens logiciels (je ne peux pas comprendre pourquoi il n'est pas pris en charge directement par PowerShell), ou fsutilpour les liens physiques.

Si vous en avez besoin pour travailler sur Windows XP, je ne connais rien d'autre que Sysinternals junction, donc vous pourriez être limité aux répertoires.

anon
la source
-1

J'ai trouvé cela de manière simple sans aide extérieure. Oui, il utilise une commande DOS archaïque mais cela fonctionne, c'est facile et c'est clair.

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

Celui-ci utilise la commande DOS dir pour trouver toutes les entrées avec l'attribut de lien symbolique, filtre le nom du lien spécifique suivi des crochets "[]" cibles, et pour chacune - vraisemblablement une - extrait uniquement la chaîne cible.

Steven
la source
5
Est-ce une réponse à une question différente?
Allanrbo