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. :)
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 .
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
:
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
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).
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"
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.
Vous pouvez utiliser cet utilitaire:
c:\Windows\system32\fsutil.exe create hardlink
J'ai écrit un module PowerShell comportant des wrappers natifs pour MKLINK. https://Gist.github.com/28911
Comprend des fonctions pour:
Capture la sortie MKLINK et génère les erreurs PowerShell appropriées lorsque cela est 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, 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.
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.