Création de liens matériels et logiciels via PowerShell

Est-ce que PowerShell 1.0 peut créer des liens durs et souples similaires à la variété Unix?

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

Ceci est une fonction nécessaire de toute bonne coquille, à mon humble avis. 🙂

Vous pouvez appeler le mklink fourni 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 à mklink si la cible est un répertoire.

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

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 la création de liens avec un New-Item :

entrer la description de l'image ici

Non, il n’est pas intégré à PowerShell et l’utilitaire mklink sous Windows Vista / Windows 7 est directement intégré à cmd.exe . Vous pouvez utiliser les extensions de communauté PowerShell (gratuites). Il existe plusieurs applets de commande pour les points d’parsing de différents types:

  • New-HardLink ,
  • New-SymLink ,
  • New-Junction ,
  • Remove-ReparsePoint
  • et d’autres.

Dans Windows 7, la commande est

 fsutil hardlink create new-file existing-file 

PowerShell le trouve sans le chemin d’access complet (c: \ Windows \ system32) ou l’extension (.exe).

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" 

L’utilitaire de ligne de commande Junction de Sysinternals facilite la création et la suppression de liens symboliques. Liens durs et jonctions dans Windows.

Vous pouvez utiliser cet utilitaire:

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

J’ai écrit un module PowerShell qui contient 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 des erreurs PowerShell appropriées si nécessaire.

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

J’ai trouvé ce moyen simple sans aide externe. Oui, il utilise une commande DOS archaïque mais ça marche, c’est facile et c’est clair.

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

Cela utilise la commande dir de DOS pour trouver toutes les entrées avec l’atsortingbut de lien symbolique, filtre sur le nom de lien spécifique suivi par les crochets “[]” cibles, et pour chacun – probablement un – extrait uniquement la chaîne cible.

En fait, la commande junction Sysinternals ne fonctionne qu’avec les répertoires (ne me demandez pas pourquoi), elle ne peut donc pas relier les fichiers. Je voudrais aller avec cmd /c mklink pour les liens cmd /c mklink (je ne peux pas comprendre pourquoi il n’est pas pris en charge directement par PowerShell), ou fsutil pour les liens cmd /c mklink .

Si vous en avez besoin pour fonctionner sous Windows XP, je ne connais rien d’autre que la junction Sysinternals, vous pouvez donc être limité aux répertoires.