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

163
demandé sur Peter Mortensen 2009-05-21 22:41:22

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 .

198
répondu Jason R. Coombs 2017-12-31 18:40:55

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:

entrez la description de l'image ici

147
répondu jocassid 2018-09-14 09:45:21

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.
36
répondu Keith Hill 2017-11-21 05:25:32

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

20
répondu quigi 2012-04-10 13:18:58

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"
14
répondu bviktor 2013-10-24 14:02:57

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.

9
répondu notandy 2009-05-21 20:59:40

Vous pouvez utiliser cet utilitaire:

c:\Windows\system32\fsutil.exe create hardlink
5
répondu Cheeso 2017-05-28 22:07:25

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.

3
répondu joshuapoehls 2012-06-07 20:31:01

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"""
    }
}
2
répondu mhenry1384 2017-05-28 22:11:22

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.

1
répondu anon 2017-05-28 22:09:00

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.

0
répondu Steven 2013-04-10 15:31:21