Création de liens durs et souples à L'aide de PowerShell
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?
Ceci est une fonction nécessaire de toute bonne coquille, à mon humble avis. :)
11 réponses
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 .
Utilisation:
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 nécessiter de privilèges d'administrateur lors de la création de liens avec New-Item
:
Non, il n'est pas intégré dans PowerShell et l'utilitaire mklink
sur Windows Vista/Windows 7 est construit directement dans cmd.exe
. Vous pouvez utiliser les Extensions de la 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.
Dans Windows 7, la commande est
fsutil hardlink create new-file existing-file
PowerShell le trouve sans le chemin complet (c:\Windows\system32) ou extension (.EXE).
Nouveau-Lien Symbolique:
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"
}
Supprimer-Lien Symbolique:
Function Remove-SymLink ($link)
{
if (test-path -pathtype container $link)
{
$command = "cmd /c rmdir"
}
else
{
$command = "cmd /c del"
}
invoke-expression "$command $link"
}
Utilisation:
New-Symlink "c:\foo\bar" "c:\foo\baz"
Remove-Symlink "c:\foo\bar"
L'utilitaire de ligne de commandeJunction de Sysinternals facilite la création et la suppression de liens symboliques (soft). 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 a des wrappers natifs pour MKLINK. https://gist.github.com/2891103
Comprend des fonctions pour:
- Nouveau-Lien Symbolique
- Nouveau-HardLink
- Nouvelle Jonction
Capture la sortie MKLINK et lance les 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"""
}
}
En fait, les Sysinternals junction
la commande ne fonctionne qu'avec les répertoires (ne me demandez pas pourquoi), donc elle ne peut pas lier les fichiers. J'irais avec cmd /c mklink
pour les liens logiciels (Je ne comprends pas pourquoi il n'est pas supporté directement par PowerShell), ou fsutil
pour les liens durs.
Si vous en avez besoin pour fonctionner sur Windows XP, Je ne connais rien d'autre que Sysinternals junction
, donc vous pourriez être limité aux répertoires.
J'ai trouvé cela de manière simple sans aide externe. 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]
}
Cela utilise la commande DOS dir pour trouver toutes les entrées avec l'attribut de lien symbolique, les filtres sur le nom de lien spécifique suivi de la cible "[] " crochets, et pour chaque - probablement un-extrait seulement la chaîne cible.