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