web-dev-qa-db-fra.com

Création de liens physiques et virtuels à 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 tout bon Shell, à mon humble avis. :)

204
Mike T

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 transmettre /d à mklink si 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 .

236
Jason R. Coombs

Windows 10 (et Powershell 5.0 en général) vous permet de créer des liens symboliques via la cmdlet 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 requérir de privilèges administrateur lors de la création de liens avec New-Item:

enter image description here

225
jocassid

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 le extensions de communauté PowerShell (gratuit). 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.
39
Keith Hill

Dans 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) ni l'extension (.exe).

23
quigi

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

Supprimer-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"
15
bviktor

L'utilitaire de ligne de commande Junction de Sysinternals facilite la création et la suppression de liens symboliques (logiciels). Liens physiques et jonctions sous Windows.

10
notandy

Vous pouvez utiliser cet utilitaire:

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

J'ai écrit un module PowerShell comportant des wrappers natifs pour MKLINK. https://Gist.github.com/28911

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.

3
joshuapoehls

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

En fait, la commande Sysinternalsjunction ne fonctionne qu'avec les répertoires (ne me demandez pas pourquoi), elle ne peut donc pas créer de lien dur. J'irais avec cmd /c mklink pour les liens symboliques (je ne peux pas comprendre pourquoi ce n'est pas directement pris en charge par PowerShell), ou fsutil pour les liens physiques.

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

1
anon

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

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

Cette commande utilise la commande DOS pour rechercher toutes les entrées avec l’attribut de lien symbolique, des filtres sur le nom du lien spécifique, suivis des crochets "[]" cibles, et pour chacun - vraisemblablement un - n’extrait que la chaîne cible.

0
Steven